ホームページ > バックエンド開発 > C++ > memcpy は C で自明にコピー可能なオブジェクトを構築しますか?

memcpy は C で自明にコピー可能なオブジェクトを構築しますか?

Linda Hamilton
リリース: 2024-11-08 15:11:02
オリジナル
1033 人が閲覧しました

Does memcpy Construct Trivially Copyable Objects in C  ?

memcpy を使用した簡単にコピー可能なオブジェクトの「構築」の互換性を明らかにする

C プログラミングの領域では、memcpy のようなビット単位のコピー メソッドを使用して簡単にコピー可能なオブジェクトを構築します。オブジェクトの寿命に関する議論を引き起こしました。次のコードで b が指すオブジェクトは、明確に定義された有効期間を持つことが保証されていますか?

struct T {
    int x, y;
};

int main() {
    void *buf = std::malloc(sizeof(T));
    if (!buf) return 0;

    T a{};
    std::memcpy(buf, &a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}
ログイン後にコピー

未解決の問題

C現在進行中の議論や提案にもかかわらず、基準はこの問題に関して曖昧なままです。明確なガイダンスがないため、この疑問は未解決のままであり、セマンティクスベースの分析ツール、オプティマイザー、およびライフタイム追跡に影響を及ぼしています。

N3751 提案

N3751 は、memcpy を認識することを提案しています。オブジェクト構築として個別の簡単なコピー可能なオブジェクトを含む操作、ライフタイム分析を維持しながらバイナリ IO をサポート機能.

C 14 標準

C 14 標準では、オブジェクトの作成は、定義、新しい式を通じて、または実装が必要とみなした場合に発生すると定義されています。現在の言語では、オブジェクトを構築するための memcpy の使用に明示的に対応していません。

std::vector 実装

std::vector の現在の実装は、実用的なシナリオを強調しています。この問題が発生すると、未定義の動作が発生します。

提案p0593: 暗黙的なオブジェクトの作成

提案 p0593 は、malloc や memcpy の呼び出しなど、オブジェクトが暗黙的に作成されるシナリオを明示的に定義することで、このあいまいさに対処することを目的としています。これは、プログラムに定義された動作を与え、オンデマンドでオブジェクトを作成するメカニズムを提案します。ただし、この提案はまだ検討中です。

結論

memcpy を使用したオブジェクト構築の状況は、C コミュニティで引き続き議論されているトピックです。コンセンサスが得られ、標準が更新されるまで、提供された例のようなコードの動作は未定義のままであり、予期しないプログラムの動作につながる可能性があります。

以上がmemcpy は C で自明にコピー可能なオブジェクトを構築しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート