gcc 什么是放置新功能的底层实现?

mcdcgff0  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(132)
T *p = ::operator new(sizeof(T));
new (p) T;

字符串
我想知道这个语法是如何工作的,因为placement new被声明为:

void* operator new(std::size_t, void*)


第二个参数void*似乎指向对象的存储,那么C如何将new (p) T连接到void*
在gcc libsupc
中,实现很简单:

// Default placement versions of operator new.
_GLIBCXX_NODISCARD inline void* operator new(std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }

_GLIBCXX_NODISCARD inline void* operator new[](std::size_t, void* __p) _GLIBCXX_USE_NOEXCEPT
{ return __p; }


编译器是否负责将语法new(*T) T转换为位置operator new的调用?

jyztefdp

jyztefdp1#

编译器是否有责任将语法new(*T)T转换为对位置运算符new的调用?
是的,没错。
Placement new不能作为库函数实现,它需要编译器进行特殊处理。您在libsupc++源代码中看到的实际实现在这里可能会产生误导,因为placement new调用的大多数关键属性都没有在该实现中反映出来。

yshpjwxd

yshpjwxd2#

使用正则new表达式可以做两件事:它调用分配内存的函数operator new(但不构造),然后调用该位置的构造函数,在该内存中创建对象。
对于placement new,operator new(std::size_t, void*)是一个无操作,只是返回传入的指针,然后编译器调用该位置的构造函数,在该内存中创建对象。

//normal version                   calls these two functions
MyClass* pMemory = new MyClass;    void* pMemory = operator new(sizeof(MyClass));
                                   MyClass::MyClass(pMemory); //pseudo-syntax

字符串
您还可以创建自己的自定义new方法,这些方法也可以使用相同的通用机制。

void* operator new(std::size_t, const char* name) {
    return get_memory_by_name(name);
}

const char* allocation_name = "complex_float";
std::complex<float>* c = new(allocation_name) std::complex<float>{};

相关问题