C での暗黙的なオブジェクト作成 : 「構築」のトリッキーなケース
C でのメモリ コピー (memcpy) の動作簡単にコピー可能な型を使用すると、オブジェクトのライフサイクルに関する疑問が生じる可能性があります。次のコード スニペットは、この曖昧さを示しています。
#include <cstdlib> #include <cstring> 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); return 0; }
重要な問題は、T *b = static_cast で始まるコード セグメントが、有効期間が開始したオブジェクトを作成するかどうかです。 C 標準はこの問題について明確さを欠いており、未指定と呼ばれています。
N3751 (memcpy をオブジェクト構築操作として認識することを提案する論文) はまだ標準に受け入れられていません。現在の標準草案では、定義、新しい式、または実装のニーズによるオブジェクトの作成について言及していますが、memcpy を使用して作成されたコピーについては明示的に言及していません。
提案 p0593 は、暗黙的なオブジェクト作成の概念を導入することで、この曖昧さに対処することを目的としています。低レベルのメモリ操作用。 memcpy および同様の操作によって、新しく割り当てられたストレージ内にオブジェクトが暗黙的に作成されることが提案されています。これにより、提示されたコード スニペットに明確に定義された動作が提供されます。
ただし、p0593 はまだレビューまたは承認されていないことに注意することが重要です。したがって、自明にコピー可能な型で使用された場合の memcpy の動作は、C 標準では未指定のままです。
以上がmemcpy は C で暗黙的にオブジェクトを構築しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。