【问题标题】:What does new(3) mean?新(3)是什么意思?
【发布时间】:2017-09-30 22:14:35
【问题描述】:
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);

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

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

【问题讨论】:

标签: c++ memory-management operator-overloading new-operator


【解决方案1】:

此代码来自LLVM's codebase。 有一个自定义的operator new in scope 用于placement-new 初始化对象(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

具体来说,该代码用于调整分配的空间以适应其他数据。

【讨论】:

    【解决方案2】:

    假设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);
    //                   ~~~
    

    【讨论】:

      【解决方案3】:

      您可能在 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的最后部分

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多