私は次のコードを持っています:
struct foo {};
void bar(foo *d) {
new(d) foo(*d);
}
式は、new(d) foo(*d)
によって指されたオブジェクトを変更しd
ないままにしますか? より具体的には、クラスfoo
とその中に再帰的に含まれるすべてのオブジェクトに自明なコピーコンストラクターしかない場合、上記はnew(d) foo(*d)
当てはまります*d
か? そうでない場合はnew
、コピー コンストラクターを呼び出す前に、まずメモリをゼロにします。C++ 言語にそのような節はありますか?
編集: 誰かがこれをやりたいと思うのには、重要な理由があります。たとえば、CPU メモリから GPU メモリに、アドレス空間全体でオブジェクトをコピーすることを検討してください。そのための 1 つの解決策は、オブジェクトをバイト単位で処理することです。これは多くの場合に機能します。クラスに仮想メソッドがある場合、バイトごとのコピーによって vtable ポインターがコピーされ、これが一部の CPU メモリを指します。オブジェクトで上記の式を使用してnew(d) foo(*d)
、コンパイラに vtable ポインタを強制的にリセットさせることができます。