"MyClass a(anotherInstance);"比"MyClass a = anotherInstance;"快吗?

Is "MyClass a(anotherInstance);" faster than "MyClass a = anotherInstance;"?

本文关键字:anotherInstance MyClass 快吗      更新时间:2023-10-16

我目前正在重新设计一个同事的代码。我发现他经常使用像

这样的语法
double a(anotherDouble);  --- A

代替

double a = anotherDouble;  --- B

我想知道如果他的语法更快,也许方法A可以保存构造函数操作?

谁能给点见解吗?

谢谢你,祝你节日愉快!

对于内置数据类型double,它们都是相同的,没有性能差异。

对于自定义类。
第一个是直接初始化,第二个是复制初始化

优秀阅读:

复制初始化和直接初始化有区别吗

对于double(或某些预定义类型),这应该无关紧要。我发现double pi=3.14;double pi(3.14);更容易读,但这是一个品味问题。

对于用户定义的class C,写C x = C(3);可能涉及一个用于初始化的构造函数和另一个用于复制的构造函数,但有时它由编译器优化。

这里根本没有调用赋值操作符。A a = b;总是调用构造函数。如果bA类型的对象,则调用复制构造函数。如果b是其他类型B的对象,则调用合适的构造函数,例如A( const B& )。在任何情况下,A a(b);A a = b;都将产生完全相同的代码,并且调用一次相同的构造函数。

将无法编译,因为没有合适的构造函数,即使类TB有合适的赋值操作符和默认构造函数:

#include <iostream>    
class TA
{
 public:
  TA()
  {
   std::cout << "TA()" << std::endl;
  }
  TA( const TA& )
  {
   std::cout << "TA(const TA&)" << std::endl;
  }
};
class TB
{
 public:
  TB()
  {
   std::cout << "TB()" << std::endl;
  }
  TB( const TB& )
  {
   std::cout << "TB(const TB&)" << std::endl;
  }
  TB& operator=( const TA& )
  {
   std::cout << "TB& operator=( const TA& )" << std::endl;
   return ( *this );
  }
};
int main( void )
{
 TA la;
 TB lb = la;
 return ( 0 );
}

所以你的问题的答案是"不,它不是更快,它是100%相同的"

double不是一个可以开始的类。但无论如何,我从来没有见过一个编译器为这两种结构生成不同的代码,即使是类,它们也会生成等效的代码,并且标准明确地声明。