Non-TriviallyCopyable Objects の std::memcpy の未定義の動作
C 標準では、std::memcpy の動作が未定義であると指定されていますTriviallyCopyable ではないオブジェクトの場合。ここで疑問が生じます。なぜこの動作がまったく未定義になるのでしょうか?
未定義の動作が発生するのは、std::memcpy を使用して、自明ではないコピー可能なソース オブジェクトの基礎となるバイトをターゲット オブジェクトにコピーする場合です。同じタイプの場合、ターゲット オブジェクトは技術的に破壊されます。そのストレージは、デストラクターの呼び出しやコンストラクター呼び出しによる再初期化を行わずに再利用されています。
そのため、ターゲット オブジェクトのメンバー関数またはデータ メンバーのその後の使用は未定義とみなされます。これには、自動ストレージ期間を持つオブジェクトの暗黙的なデストラクター呼び出しが含まれます。未定義の動作は遡及的です。つまり、未定義のアクションの前であっても操作に影響を与える可能性があります。
この未定義の動作を防ぐには、プログラマが明示的に保証しない限り、自明ではないコピー可能オブジェクトに対して std::memcpy を使用しないことが重要です。これにより、さらに未定義の操作が発生することはありません。
標準ライブラリは std::copy を最適化し、効率的なバイトレベルのコピーのために memcpy を利用することにより、自明にコピー可能な型の std::swap アルゴリズム。したがって、潜在的な未定義の動作を回避し、期待されるプログラムのセマンティクスを確保するには、汎用アルゴリズムを遵守し、コンパイラーに最適化を処理させることをお勧めします。
以上が自明ではないコピー可能オブジェクトに対する「std::memcpy」の未定義の動作はなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。