placement new底层实现原理及语法映射机制技术问询
关于C++ placement new语法与operator new关联的问题
代码示例与背景
首先看以下placement new的使用代码:
T *p = ::operator new(sizeof(T)); new (p) T;
已知标准中placement new的声明为:
void* operator new(std::size_t, void*)
其中第二个void*参数指向预分配好的对象存储空间,问题是:C++如何将new (p) T语法与该void*参数关联?是否由编译器负责将该语法转换为对placement operator new的调用?
解答
是的,这个转换逻辑完全由C编译器负责,属于C语言标准明确规定的行为,具体细节如下:
- 当使用
new (参数列表) 类型这种带额外参数的new表达式时,编译器会自动匹配对应的operator new重载:operator new的第一个参数固定为std::size_t,用于传递要创建对象的字节大小,这个参数由编译器自动推导并传入,不需要开发者手动指定- 括号中的参数(比如示例里的
p)会按顺序对应到operator new从第二个开始的参数,这里p是void*类型,正好匹配placement版本operator new的第二个参数
- 编译器处理
new (p) T的完整流程:- 自动生成调用代码:
::operator new(sizeof(T), p),把对象大小和用户提供的内存地址传入 - 如果
operator new调用成功返回内存地址,编译器会在该地址上调用T的默认构造函数,完成对象的初始化
- 自动生成调用代码:
- 再看gcc libsupc++中的实现,placement版本的
operator new只是直接返回传入的void*参数,这是因为内存已经由开发者提前分配完成(示例中的::operator new(sizeof(T))),这个重载的作用就是把用户预分配的内存地址传递给后续的构造函数调用环节。
内容的提问来源于stack exchange,提问作者akanesora
相关产品推荐
相关产品推荐

