C のヘッダー文字列/byte/memcpy は、std::memcpy の動作が次のように指定されています。コピーされるオブジェクトが自明にコピー可能ではない場合は、未定義です。これは、簡単にコピーできない型に対して memcpy を使用しようとすると、プログラムが未定義状態になり、クラッシュ、データ破損、予期せぬ結果などのあらゆる事態が発生する可能性があることを意味します。
では、なぜそうなるのか標準ではこれを指定する必要があると考えられますか?
自明にコピー可能な型の場合、コピー操作はソースから宛先への単純なビット単位のコピーです。オブジェクトは同じメモリ レイアウトを持ち、コピー操作を実行するための特別な要件はありません。
ただし、自明ではないコピー可能型には、コンストラクター、デストラクター、または実行が必要なその他の特別な動作がある場合があります。オブジェクトがコピーされたとき。たとえば、クラスには、ポインターを初期化するコンストラクターや、リソースを解放するデストラクターが含まれる場合があります。
自明ではないコピー可能型に対して memcpy を使用すると、これらの特別な動作をバイパスすることになり、次のような問題が発生する可能性があります。未定義の動作に。たとえば、コンストラクターを呼び出さずにオブジェクトをコピーした場合、オブジェクトが適切に初期化されず、そのメンバーにアクセスするとクラッシュが発生する可能性があります。
標準では、memcpy の動作は、非これらの潜在的な問題からユーザーを保護するために、簡単にコピー可能な型を使用します。標準では、正しいコピー コンストラクターまたは代入演算子の使用を強制することで、意図した動作を維持する方法でオブジェクトがコピーされることが保証されます。
場合によっては、未定義の動作を回避することは可能ですが、それはお勧めできません。標準に従って、自明ではないコピー可能な型に対して正しいコピー メカニズムを使用することが常に最善です。
以上が自明ではないコピー可能オブジェクトに対して `std::memcpy` が定義されていないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。