"MyClass a(anotherInstance);"比"MyClass a = anotherInstance;"快吗?
Is "MyClass a(anotherInstance);" faster than "MyClass a = anotherInstance;"?
我目前正在重新设计一个同事的代码。我发现他经常使用像
这样的语法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;
总是调用构造函数。如果b
是A
类型的对象,则调用复制构造函数。如果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
不是一个可以开始的类。但无论如何,我从来没有见过一个编译器为这两种结构生成不同的代码,即使是类,它们也会生成等效的代码,并且标准明确地声明。