5

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

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

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

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

4

5 回答 5

6

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

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

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

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

于 2013-08-28T16:53:20.427 回答
3

是和不是。

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

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

于 2013-08-28T16:55:22.530 回答
1

它的性能与此大致相同:

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

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

于 2013-08-28T16:52:22.387 回答
0

它将 's 初始化int为零,这可能很好并且需要少量时间。

于 2013-08-28T16:51:00.180 回答
0

For the general question does constructor affect performance, the answer is it depends.

  • In general, you want to use the initializer list when you can (otherwise you may be incurring on a default constructor and then a copy assignment, refer to this question for further explanation).

  • If you provide a non-throwing move constructor (i.e. noexcept(true)) operations like push_back into a container will use such (presumably cheap) constructor (otherwise the operation will copy values, presumably more expensive).

I am sure that others can come up with other reasons.

Finally, I would focus at this point in getting something working. If you then determine (after appropriate profiling) that your constructors are a bottleneck (I highly doubt it), then worry about improving them. Otherwise you may be wasting your time in utterly irrelevant nano-optimizations.

Note:

I made TWO big mistakes in answering this questions. I have removed them from the answer. Please see this comment's history to find out more.

于 2013-08-28T17:02:38.920 回答