c++ - 【转自知乎】关于new的定位功能(placement new),这个功能是不是多余的?
伊谢尔伦
伊谢尔伦 2017-04-17 15:22:05
0
1
692

看了书上,new的定位功能可以在你指定的地址开辟新的内存。但是貌似不用这个新功能照样也可以做到这些。
比如

int *pa=new int;
double *pa_a = (double *) pa;

这个也可以生成一个指向 pa 地址的另一个类型的指针。其地址应该也没发生变化吧?
希望有大神能解决我的疑惑。我实在是感觉new的定位功能貌似很鸡肋一样。我通过强制转换指针类型也可以做到这个需求。

以上为知乎https://www.zhihu.com/question/38230267的内容,我也感到奇怪,在工程中会用到么?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全員に返信(1)
PHPzhong

あなたが挙げた例は基本的なタイプのものであり、intsizedoublesizeよりも小さいため、問題が発生しやすいです

placement new の機能は、新しいメモリを開くことではなく、指定されたメモリ ブロック上にオブジェクトを構築することです

例:

リーリー

上記のコードでは、pb は新しく割り当てられたメモリを指しませんが、pa が指すメモリを再利用します。
は、pa の構造体を直接呼び出します。 > 関数 B が実行された後、
、メモリ内の pb == pa オブジェクトだけが A オブジェクト B
になります。 注: sizeof(B) <= sizeof(A)

ご指摘の

については、ポインタの型のみが変更されており、强制类型转换 のコンストラクターを呼び出すことができません。つまり、メモリ ブロックは B オブジェクトのままですが、A ではありません。オブジェクトB

エンジニアリングの実践では、一般にメモリ管理で使用されます。

は、より効率的で柔軟なメモリ割り当て戦略が必要な場合 (独自の
内存池 に実装するなど) で使用されます。元のメモリ ブロックを再利用すると、placement newmalloc の頻繁な発生を回避できます) free

たとえば、

を毎日使用する場合、その下の stl が使用されます memory allocator (詳細については placement new を参照してください) 《stl源码剖析》

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート