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

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

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

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

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

伊谢尔伦
伊谢尔伦

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

全部回覆(1)
PHPzhong

你舉的這個例子是針對基本型,而且舉得不好,intsizedoublesize要小,這樣容易出問題

placement new的作用不是開闢新內存,是在指定內存區塊上構造物件

舉例:

struct A {...};
struct B {...};

A* pa = new A;
pa->~A();
B* pb = new (pa) B

在上面的程式碼中,pb並沒有指向一塊新開闢的內存,而是重用了pa指向的內存,
直接在pa指向的內存上調用B的構造函數,
執行完後,pb == pa,只是記憶體上的A物件變成了B物件
註: sizeof(B) <= sizeof(A)

而你說的强制类型转换,只改變了指標型,是無法呼叫B的建構子的,即,記憶體區塊上依然是A物件而變不為B物件

工程實務上一般用在記憶體管理這一塊上,
在某些需要效率更高、靈活度更大的記憶體分配策略的場合上(比如實作自己的内存池),就會用到placement new(複用原有記憶體區塊,就可以免除mallocfree的頻繁發生)

例如你天天在用的stl,它底下的memory allocator就用到了placement new(詳情可以唸讀《stl源码剖析》

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板