Tag: 布局 新

将空指针传递给新的位置

默认放置位置new运算符在18.6 [support.dynamic]¶1中用非抛出exception规范声明: void* operator new (std::size_t size, void* ptr) noexcept; 这个函数除了return ptr;外什么也不做return ptr; 所以它是合理的,但是根据5.3.4 [expr.new]¶15这意味着编译器必须检查它在调用对象的构造函数之前不会返回null: -15- [ 注意:除非使用非抛出exception规范(15.4)声明了分配函数,否则它表示抛出std::bad_allocexception来分配存储失败(条款15,18.6.2.1); 否则返回一个非空指针。 如果使用非抛出exception规范声明分配函数,则返回空值以指示分配存储失败,否则返回非空指针。 – 注意 ]如果分配函数返回null,则不进行初始化,不应该调用解除分配函数,new-expression的值应该为空。 在我看来,(特别是安置new ,不是一般的)这个空检查是一个不幸的performance打击,尽pipe很小。 我一直在debugging一些代码,其中放置new被用在一个性能敏感的代码path中,以改善编译器的代码生成,并且在程序集中检查了null。 通过提供一个特定于类的放置位置的new重载,这个重载是通过抛出的exception规范来声明的(即使它不可能抛出),条件分支也被移除了,这也允许编译器为周围的内联函数生成更小的代码。 说安置newfunction的结果可能会抛出,尽pipe它不能 ,是明显更好的代码。 所以我一直想知道是否真的需要空位检查new情况下安置。 它可以返回null的唯一方法是如果你通过它null。 虽然这是可能的,而且显然是合法的,写: void* ptr = nullptr; Obj* obj = new (ptr) Obj(); assert( obj == nullptr ); 我不明白为什么这将是有用的,我build议,如果程序员必须在使用安置之前明确地检查空 Obj* obj = ptr ? new (ptr) […]