C++ 动态分配对象的大括号初始化和副本初始化之间的区别

C++ 动态分配对象的大括号初始化和副本初始化之间的区别,c++,c++11,initialization,C++,C++11,Initialization,这一个可能是微不足道的,但我无法正确命名,因此我无法找到答案 1和2在性能方面是否存在显著差异 class Object { int number_; Object(int number) : number_(number) {} }; // then, in main. Object* objPtr1 = new Object(11) // nr.1 Object* objPtr2 {new Object{11}} // nr.2 据我所知,2的唯一优点是,objPtr2直接用动

这一个可能是微不足道的,但我无法正确命名,因此我无法找到答案

1和2在性能方面是否存在显著差异

class Object {
  int number_;
  Object(int number) : number_(number) {}
};

// then, in main.

Object* objPtr1 = new Object(11) // nr.1
Object* objPtr2 {new Object{11}} // nr.2
据我所知,2的唯一优点是,
objPtr2
直接用动态创建对象的地址初始化, 因此,不涉及复制

另一方面,
objPtr1
正在进行复制初始化,这意味着:

  • 运算符
    new
    返回新创建对象的地址
  • 正在将地址复制到
    objPtr1

  • 这个过程涉及不必要的复制,可以通过直接初始化来忽略(如图2所示)。如果我的理解是正确的,那么从性能角度来看,使用2比1会有很大的不同吗?

    在这种情况下,您会发现它们的作用完全相同:谢谢您回答@Ted。你让我意识到我可以在几分钟内自己找到答案。至少现在,当我遇到类似的问题时,我知道该使用什么工具了,干杯!通过复制从
    new
    返回的地址,以相同的方式初始化两个指针。所以,是的,这里涉及到复制,但只涉及到指针,这在这里被认为是微不足道的。