【问题标题】:Does constructor affect performance?构造函数会影响性能吗?
【发布时间】:2013-08-28 16:48:55
【问题描述】:

我的类有 3 个声明为公共的成员变量, 我最初可以在代码中的任何地方显式使用它,但我仍然用初始值编写了构造函数,这个构造函数会影响性能开销吗?

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

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

如果构造函数增加了性能开销,请告诉我?

【问题讨论】:

  • 除非你每秒调用构造函数数百万次,否则它是无关紧要的。
  • 如果编译器能够证明您之后总是在所有代码路径上显式初始化它,那么编译器应该能够将其优化为死赋值。同样,如果您在所有后续代码路径上分配复制省略,则应该启动它。

标签: c++ performance optimization constructor initialization


【解决方案1】:

初始化可能会产生少量成本。然而:

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

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

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

【讨论】:

    【解决方案2】:

    是和否。

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

    不,在实践中它不会增加性能开销,因为该操作将花费很短的时间。此外,您需要在某些时候初始化您的字段无论如何(您永远不会使用未初始化的字段,对吗?)。因此,您只需在需要更改初始值时支付实际的性能开销。 但是你可以通过定义第二个构造函数(一个带参数的构造函数)来实现正确的初始值,你可能应该这样做,这样你就可以避免调用默认的构造函数'对它不感兴趣,而是调用一个构造函数,让你的对象完全按照你想要的方式初始化。

    【讨论】:

      【解决方案3】:

      它的性能与此大致相同:

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

      意味着性能影响完全可以忽略不计,您不必担心。

      【讨论】:

        【解决方案4】:

        它将int 初始化为零,这很可能会花费一些时间。

        【讨论】:

          【解决方案5】:

          对于一般问题构造函数是否影响性能,答案是取决于

          • 一般情况下,您希望尽可能使用 初始化器列表(否则您可能会产生默认构造函数,然后是复制赋值,请参阅 this question 以获得进一步说明)。

          • 1234563

          我相信其他人可以想出其他理由。

          最后,我会在这一点上专注于让某些东西发挥作用。如果您随后确定(在适当的分析之后)您的构造函数是一个瓶颈(我非常怀疑),那么请担心改进它们。否则,您可能会在完全不相关的纳米优化上浪费时间。

          注意:

          我在回答这个问题时犯了两个大错误。我已将它们从答案中删除。请查看此评论的历史以了解更多信息。

          【讨论】:

          • 真的吗?您正在阅读比我其他的规范吗?您能否参考标准中说明这一点的确切部分,因为我想了解您是如何得出这个结论的。
          • 这不是标准所说的,也不是大多数编译器所做的。变量未初始化,任何读取它们的尝试都是未定义的行为。
          • 很容易得出相反的结论:C++ 草案 n3290, §8.5, ¶11: "如果没有为对象指定初始化器,则默认初始化该对象;如果没有执行初始化,具有自动或动态存储期限的对象具有不确定的值。"
          • 我指的是:“如果没有为对象指定初始化器,则该对象默认初始化;如果不执行初始化,则自动或动态存储时长的对象具有不确定的值. [注意:具有静态或线程存储持续时间的对象是零初始化的,请参见 3.6.2. — 结束注释]"
          • 在查看我的答案时,我担心这仅适用于静态变量...让我进一步检查...
          猜你喜欢
          • 2020-05-30
          • 1970-01-01
          • 1970-01-01
          • 2010-09-09
          • 2011-07-07
          • 1970-01-01
          • 2011-04-09
          • 2021-04-29
          • 2012-02-04
          相关资源
          最近更新 更多