2013-08-28 79 views
3

我有3个成员变量的类声明为public, 我可以初步明确它在任何地方的代码,还是我写的构造与初始值不此构造影响性能开销?构造函数是否影响性能?

class ABC{ 
    public: 
    int a; 
    int b; 
    int c; 

    ABC(): a(0) , b(0), c(0) 
    { 
    } 
}; 

请让我知道构造函数是否会增加性能开销?

+6

除非你每秒调用构造函数数百万次,否则它是不相关的。 –

+1

如果编译器能够证明你以后总是明确地在所有代码路径上初始化它,那么编译器应该能够将它优化为死分配。同样,如果您将其分配给所有后续代码路径,copy-elision都应该启动。 – Mysticial

回答

0

它初始化了int的到零,这是良好的概率,并采取的时间smalll量。

1

它大致有完全相同的性能,这一点:

int a = 0; 
int b = 0; 
int c = 0; 

含义对性能的影响是如此微不足道的完全你不应该永远担心。

6

初始化可能会出现一个小的成本。但是:

  1. 如果编译器能证明它们是不必要的,编译器可能能够消除初始化。

  2. 即使有小的成本,这是压倒性的可能,它是整个应用程序的上下文完全无关。您可以使用分析器来量化性能影响。

  3. 它可以让你知道,这三个领域总是会得到初始化,从而消除了某些类型的潜在的bug的保证。

3

是和否。

是的,它确实增加了一些性能开销,因为你让计算机做一些操作,而在默认情况下,它不会初始化基本类型的成员。

不,它不增加实践中的性能开销,因为操作将花费微不足道的时间。此外,你需要一些时间来初始化领域反正(你永远不会与未初始化下地干活,你愿意吗?)。因此,当您需要更改初始值时,您只会支付实际的性能开销。 你可以通过定义一个第二构造函数(这需要参数)实现初始值,你应该,这样就可以避免默认的构造函数调用时你不感兴趣,相反,通话一个构造函数,它使您的对象完全按照您的需要进行初始化。

0

对于一般问题并构造影响性能,答案是这取决于

  • 一般情况下,你要使用的初始化列表时,你可以(否则你可能会在一个默认的构造招致然后拷贝赋值,请参阅this question进一步解释)。如果你提供一个非抛出移动构造函数(即noexcept(true)),像push_back这样的操作将使用这样的(推测是便宜的)构造函数(否则操作将复制值,可能会更昂贵)。

我相信其他人可以想出其他原因。

最后,我将重点介绍如何获得某些工作。如果你确定(在适当的分析后)你的构造函数是一个瓶颈(我非常怀疑它),然后担心改进它们。否则,你可能会浪费你的时间在完全不相关的纳米优化。

注:

我在回答这个问题做了两个大错误。我已经从答案中删除了他们。请参阅此评论的历史了解更多信息。

+0

真的吗?你是否阅读另一个规范比我?你能否参考标准的具体部分来说明这一点,因为我想了解你是如何得出这个结论的。 –

+0

这不是标准所说的,也不是大多数编译器所做的。这些变量保持未初始化,任何尝试从它们读取都是未定义的行为。 –

+1

相反的结论很容易得出:C++草案n3290,§8.5,¶11:“*如果没有为对象指定初始化程序,则该对象将被默认初始化;如果未执行初始化,则会自动或动态存储一个 对象*“ –

相关问题