C++构造函数与初始化列出速度比较

Seb*_*ebi 17 c++ constructor initialization-list

构造函数和初始化列表之间的执行时间是否存在差异?(或者只是编码首选项的问题).我有一组需要经常创建的对象,并且想知道使用初始化列表而不是构造函数是否有任何性能提升.

如果我要创建一百万个A类实例和另一百万个B类实际选择会更好(这些对象代表网络中生成的数据包,因此这些数字).

 class A {
   private:
     int a, b;

   public:
     A(int a_var, int b_var):a(a_var), b(b_var) {}; 
 };

 class B {
   private:
     int a, b;

   public:
     B(int a_var, int b_var) {
        a = a_var;
        b = b_var;
     }
};
Run Code Online (Sandbox Code Playgroud)

如果任何构造函数对于基本类型比其他构造函数更快(如示例中所示),如果a和b被类型替换,它会更快吗?

输入示例:

 class AType {
   private:
     string a, b;

   public:
     AType(string a_var, string b_var):a(a_var), b(b_var) {}; 
};
Run Code Online (Sandbox Code Playgroud)

Pio*_*ycz 16

不同之处在于没有普通默认构造函数的类型,这是由类中的编译器为您调用的B.你的班级B相当于:

 class B {
   private:
     SleepyInt a, b;

   public:
     // takes at least 20s
     B(int a_var, int b_var) : a(), b()
     //                      ^^^^^^^^^^ 
     {
        a = a_var;
        b = b_var;
     }
  };
Run Code Online (Sandbox Code Playgroud)

如果你没有在初始化列表中放置成员变量或基类构造函数 - 它会为它们调用默认构造函数.int是基本类型 - 它的默认构造函数没有任何成本 - 因此在您的示例中没有区别,但对于更复杂的类型,构造函数+赋值可能不仅仅是构造.

一些有趣的例子,只是为了说明差异:

class SleepyInt {
public:
  SleepyInt () { 
    std::this_thread::sleep_for(std::chrono::milliseconds( 10000 ));  
  }
  SleepyInt (int i) {}
  SleepyInt & operator = (int i) { return *this; }
};

class A {
   private:
     SleepyInt a, b;

   public:
     A(int a_var, int b_var):a(a_var), b(b_var) {}; 
 };

 class B {
   private:
     SleepyInt a, b;

   public:
     // takes at least 20s
     B(int a_var, int b_var) {
        a = a_var;
        b = b_var;
     }
};
Run Code Online (Sandbox Code Playgroud)


blo*_*dev 8

使用初始化列表而不是构造函数中的赋值是普遍接受的做法,并且有一个很好的理由.

初始化列表可用于初始化POD(普通旧数据)和用户定义类型.初始化POD类型时,效果与赋值运算符完全相同,这意味着初始化列表或POD类型的构造函数中的赋值之间没有性能差异.

当我们考虑非POD类型时,事情变得更有趣.在调用构造函数之前,将调用父类的构造函数,然后调用任何包含的成员,并且默认情况下将调用无参数构造函数.使用初始化列表,您可以选择调用哪个构造函数.

因此,为了回答这个问题,存在性能差异,但仅在初始化非POD类型时.