构造函数会影响性能吗?

5

我有一个类,其中有3个公共成员变量,我可以在代码中的任何地方显式地进行初始赋值,但我还是写了带有初始值的构造函数,这个构造函数会影响性能吗?

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

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

请问构造函数是否会增加性能开销?

6
除非您每秒钟调用构造函数数百万次,否则这没什么关系。 - Paul R
1
如果编译器能够证明你在之后的所有代码路径上都显式初始化它,那么编译器应该能够将其优化为死代码。同样地,如果你在所有后续的代码路径上分配它,复制省略也应该启动。 - Mysticial
5个回答

6

初始化可能会带来一些小的成本。但是:

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

  2. 即使存在一些小成本,在整个应用程序的上下文中,它几乎肯定是完全无关紧要的。您可以使用分析工具来量化性能影响。

  3. 它可以让您放心地知道这三个字段将始终得到初始化,从而消除某些潜在错误类型。


3

是和不是。

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

不,实际上并不会增加性能开销,因为该操作将花费极少的时间。此外,您需要在某个时候初始化字段(您总不会使用未初始化的字段,对吧?)。因此,只有在需要更改初始值时才会产生实际的性能开销。但是,您可以通过定义第二个构造函数(一个接受参数的构造函数)来达到正确的初始值,并且您可能应该这样做,以避免在您不感兴趣时调用默认构造函数,并代替地调用一个构造函数,使对象初始值完全符合您的要求。


1
它的性能与此大致相同:
int a = 0;
int b = 0;
int c = 0;

意思是性能影响极其微小,您永远不必担心它。

0

它将int初始化为零,这很好,并且需要很少的时间。


0
对于一般问题“构造函数是否影响性能”,答案是“视情况而定”。
  • 通常情况下,当可以使用初始化列表时应该使用它(否则可能会产生默认构造函数和复制赋值,有关详细说明请参见this question)。

  • 如果提供了非抛出移动构造函数(即noexcept(true)),那么像将元素push_back到容器中这样的操作将使用此(预计廉价的)构造函数(否则该操作将复制值,预计更昂贵)。

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

最后,我建议现在专注于让东西能够正常工作。如果您随后确定(经过适当的分析)你的构造函数是瓶颈(我非常怀疑),然后再考虑改进它们。否则,您可能会浪费时间进行完全无关紧要的微观优化。

注意:

我的回答中有两个大错误。我已将它们从答案中删除。有关更多信息,请参见此评论历史记录。


真的吗?你在看比我不同的规范吗?你能否引用标准中确切说明这一点的章节,因为我想了解你是如何得出这个结论的。 - Mats Petersson
这不是标准规定,也不是大多数编译器的做法。变量被留空,任何尝试从它们读取数据的行为都是未定义的。 - James Kanze
1
相反的结论很容易得出:C++草案n3290,§8.5,¶11:“如果没有为对象指定初始化程序,则该对象将进行默认初始化;如果未执行初始化,则具有自动或动态存储期的对象具有不确定的值。 - Robᵩ
这是我所指的:“如果没有为对象指定初始化程序,则该对象将进行默认初始化;如果未执行初始化,则具有自动或动态存储期的对象具有不确定值。[注:具有静态或线程存储期的对象将进行零初始化,请参见3.6.2。-注]” - Escualo
我太蠢了(今天喝的咖啡不够...),我会重新回答。 - Escualo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接