新(3)是什么意思?

What does new(3) mean?

SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);

这里的new运算符是什么意思?

new 运算符后的数字 3 是什么意思?

doc 上,它表示这是要请求的内存量(以字节为单位)。 (如果没有超载) 这是一个 3 * 8 = 24 位的请求,用于将对象存储在内存中。 在 malloc 的某种残余中考虑这一点。

假设SelectInst提供了一个用户定义的placement operator new,它接受一个int作为用户定义的参数;调用语法意味着使用用户定义的位置 operator new 进行内存分配。例如

class SelectInst {
public:
    static void* operator new (std::size_t count, int args) {
    //                                            ~~~~~~~~
        ...
    }
};

SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
//                   ~~~

您可能在 SelectInst 或全局范围内有自定义运算符 new(类似于 placement new):

struct SelectInst
{
    SelectInst(/*...*/);
    // ...

    static void* operator new(std::size_t sz, int custom);
    static void operator delete(void* ptr, int custom); // new counter part
};

void* operator new(std::size_t sz, int custom);
void operator delete(void* ptr, int custom); // new counter part

查看 operator_new

的最后一部分

此代码来自LLVM's codebase。 有一个习惯 operator new in scope and it is being used to placement-new initialize the objects (cfr. placement syntax)

void *User::operator new(size_t Size, unsigned Us) {
  return allocateFixedOperandUser(Size, Us, 0);
}

这是一个玩具示例:

class SelectInst
{
public:
  int x;
};

void *operator new(size_t Size, unsigned Us) {
                                ^^^^^^^^^^^ 3 is passed here
                   ^^^^^^^^^^^ allocation size requested

  return ... // Allocates enough space for Size and for Us uses
}

SelectInst *Create() {
  return new(3) SelectInst();
}

int main()
{
  auto ptr = Create();
  return 0;
}

Live Example

特别是该代码用于调整分配的 space 以适应其他数据。