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 サイトの他の関連記事を参照してください。