次のようなクラスがあるとします。
class MyClass
{
public:
MyClass();
int a,b,c;
double x,y,z;
};
#define PageSize 1000000
MyClass Array1[PageSize],Array2[PageSize];
クラスにポインタや仮想メソッドがない場合、次のものを使用しても安全ですか?
memcpy(Array1,Array2,PageSize*sizeof(MyClass));
私が尋ねる理由は、ここで説明するように、ページングされたデータの非常に大きなコレクションを扱っているためです。ここでは、パフォーマンスが重要であり、memcpyは反復割り当てよりもパフォーマンスが大幅に向上します。'this'ポインターは保存されているものではなく暗黙のパラメーターであるため、問題ないはずですが、他に注意すべき隠れた厄介な点はありますか?
編集:
Sharptoothsのコメントによると、データにはハンドルや同様の参照情報は含まれていません。
Paul Rのコメントによると、私はコードのプロファイルを作成しました。この場合、コピーコンストラクターを回避する方が約4.5倍高速です。ここでの理由の一部は、テンプレート化された配列クラスが、与えられた単純な例よりもいくらか複雑であり、浅いコピーを許可しない型にメモリを割り当てるときに配置を「新規」と呼ぶことです。これは事実上、デフォルトのコンストラクターとコピーコンストラクターが呼び出されることを意味します。
2番目の編集
このようにmemcpyを使用することは悪い習慣であり、一般的な場合には避けるべきであることを私は完全に受け入れることを指摘する価値があるかもしれません。それが使用されている特定のケースは、コピーコンストラクタではなくmemcpyを呼び出すパラメータ'AllowShallowCopying'を含む高性能テンプレート配列クラスの一部としてです。これは、配列の先頭近くの要素を削除したり、セカンダリストレージにデータをページングしたり、セカンダリストレージからデータをページングしたりするなどの操作に大きなパフォーマンスの影響を及ぼします。より良い理論的解決策は、クラスを単純な構造に変換することですが、これには大きなコードベースの多くのリファクタリングが含まれるため、それを回避することは私がやりたいことではありません。