我有一个类,其中有3个公共成员变量,我可以在代码中的任何地方显式地进行初始赋值,但我还是写了带有初始值的构造函数,这个构造函数会影响性能吗?
class ABC{
public:
int a;
int b;
int c;
ABC (): a(0) , b(0), c(0)
{
}
};
请问构造函数是否会增加性能开销?
我有一个类,其中有3个公共成员变量,我可以在代码中的任何地方显式地进行初始赋值,但我还是写了带有初始值的构造函数,这个构造函数会影响性能吗?
class ABC{
public:
int a;
int b;
int c;
ABC (): a(0) , b(0), c(0)
{
}
};
初始化可能会带来一些小的成本。但是:
如果编译器可以证明初始化是不必要的,那么它可能能够消除这些初始化。
即使存在一些小成本,在整个应用程序的上下文中,它几乎肯定是完全无关紧要的。您可以使用分析工具来量化性能影响。
它可以让您放心地知道这三个字段将始终得到初始化,从而消除某些潜在错误类型。
是和不是。
是的,它确实增加了一些性能开销,因为您要求计算机执行一些操作,而在默认情况下,它不会初始化基本类型的成员。
不,实际上并不会增加性能开销,因为该操作将花费极少的时间。此外,您需要在某个时候初始化字段(您总不会使用未初始化的字段,对吧?)。因此,只有在需要更改初始值时才会产生实际的性能开销。但是,您可以通过定义第二个构造函数(一个接受参数的构造函数)来达到正确的初始值,并且您可能应该这样做,以避免在您不感兴趣时调用默认构造函数,并代替地调用一个构造函数,使对象初始值完全符合您的要求。
int a = 0;
int b = 0;
int c = 0;
它将int
初始化为零,这很好,并且需要很少的时间。
通常情况下,当可以使用初始化列表时应该使用它(否则可能会产生默认构造函数和复制赋值,有关详细说明请参见this question)。
如果提供了非抛出移动构造函数(即noexcept(true)
),那么像将元素push_back
到容器中这样的操作将使用此(预计廉价的)构造函数(否则该操作将复制值,预计更昂贵)。
我相信其他人可以想出其他原因。
最后,我建议现在专注于让东西能够正常工作。如果您随后确定(经过适当的分析)你的构造函数是瓶颈(我非常怀疑),然后再考虑改进它们。否则,您可能会浪费时间进行完全无关紧要的微观优化。
注意:
我的回答中有两个大错误。我已将它们从答案中删除。有关更多信息,请参见此评论历史记录。