如何实现C++"新"运算符

How is the C++ 'new' operator implemented

本文关键字:C++ 运算符 实现 何实现      更新时间:2023-10-16
Class B;
B *b  = new B();       // default constructor
B *b1 = new B(10);     // constructor which takes an argument B(int x)

但是,如果我们想编写new的自定义版本,语法是

Class B
{
  /*...*/
  static void* operator new(size_t size);
}

如何将语句new B()转换为函数调用 operator new(sizeof(B))

它如何

跟踪要调用哪个构造函数,即它如何区分new B()new B(int x)

new是否在C++中实现为宏?

你的问题应该是:

B::operator new语法相同时,编译器如何区分new B()new B(10)

好吧,new只是分配内存,然后编译器立即插入对构造函数的调用。所以不管你叫new Bnew B()还是new B(10)

编译器解释如下内容:

B *b = static_cast<B*>(B::operator new(sizeof(B)))->B();
B *b1 = static_cast<B*>(B::operator new(sizeof(B)))->B(10);

实际上,构造函数不返回任何内容。但上面的伪代码只是内部内容的类比表示。

调用哪个构造函数的问题是基于参数列表的重载解析问题,类似于任何重载函数调用。在出现新 B(...( 的站点,所有信息都可用。编译器可以解析对类 B(名称查找(的引用,并查看可用的构造函数组合,还可以查看 B 具有自定义内存分配器机制。编译器可以发出代码以使用该内存分配器获取空间(传入 B 的大小(,然后调用相应的构造函数代码来初始化该空间中的对象。