构造函数会影响性能吗?

时间:2013-08-28 16:48:56

标签: c++ performance optimization constructor initialization

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

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

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

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

5 个答案:

答案 0 :(得分:6)

初始化可能会产生很小的成本。但是:

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

  2. 即使成本很低,也绝对有可能在整个应用程序的环境中完全无关紧要。您可以使用分析器来量化性能效果。

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

答案 1 :(得分:3)

是和否。

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

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

答案 2 :(得分:1)

它具有与此完全相同的性能:

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

意味着性能影响完全可以忽略不计,你不应该担心它。

答案 3 :(得分:0)

它将int初始化为零,这可能是好的,需要花费很少的时间。

答案 4 :(得分:0)

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

  • 一般情况下,您希望尽可能使用初始化列表(否则您可能会遇到默认构造函数,然后是复制赋值,请参阅this question进一步解释)。

  • 如果你提供一个非投掷移动构造函数(即noexcept(true)),像push_back这样的操作将使用这样的(大概是便宜的)构造函数(否则操作会复制值,大概是更贵)。

我确信其他人可以提出其他原因。

最后,我将重点关注这一点。如果你确定(在适当的分析之后)你的构造函数是一个瓶颈(我非常怀疑它),那么担心改进它们。否则,你可能会浪费时间进行完全无关的纳米优化。

注意:

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