配列の新しい配置は移植可能に使用できますか?

Patricia Arquette
リリース: 2024-11-12 13:43:01
オリジナル
182 人が閲覧しました

 Can Placement New for Arrays Be Used Portably?

配列の新しい配置: ポータブルな使用方法のガイド

新しい配置は配列割り当てのための強力なツールを提供しますが、その移植性は次のとおりです。挑戦です。提供された例で見られるように、Visual Studio は new[] に渡されたアドレスとは異なるバッファーを割り当てることがあり、メモリ破損につながる可能性があります。

オーバーヘッドについて

配列上で配置 new を使用する場合のオーバーヘッドはコンパイラに依存します。 Visual Studio では、コンパイラは 4 バイトのカウントをバッファに追加して、配列内の要素の数を追跡します。この数は、配列の削除時にオブジェクト デストラクターを呼び出すために重要です。

移植可能な代替手段

移植性の問題に対処するには、次の代替手段を検討してください。

それぞれに新しい個別の配置要素:

配列全体に新しい配置を使用する代わりに、各要素を個別に割り当てます:

char *pBuffer = new char[NUMELEMENTS * sizeof(A)];
A *pA = (A*)pBuffer;

for (int i = 0; i < NUMELEMENTS; ++i) {
    pA[i] = new (pA + i) A();
}
ログイン後にコピー

このアプローチにより、追加のオーバーヘッドが不要になり、移植性が確保されます。

手動オブジェクト破棄:

に関係なく割り当て方法では、バッファを削除する前に、配列内の各オブジェクトが手動で破棄されていることを確認します。

for (int i = 0; i < NUMELEMENTS; ++i) {
    pA[i].~A();
}
ログイン後にコピー

この手順により、メモリ リークが防止され、適切なオブジェクトのクリーンアップが保証されます。

メモリ トラッキングオーバーヘッド

メモリ追跡のためのコンパイラのオーバーヘッドは変化することに注意することが重要です。たとえば、Visual Studio では、クラスから仮想デストラクターを削除すると、4 バイトのカウントが必要なくなります。特定のコンパイラのメモリ追跡要件を理解すると、パフォーマンスの最適化に役立ちます。

以上が配列の新しい配置は移植可能に使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート