我有3个成员变量声明为public的类, 我最初可以在代码中的任何地方明确显示它,但是我仍然使用初始值编写构造函数,这个构造函数会影响性能开销吗?
class ABC{
public:
int a;
int b;
int c;
ABC (): a(0) , b(0), c(0)
{
}
};
如果构造函数增加性能开销,请告诉我?
答案 0 :(得分:6)
初始化可能会产生很小的成本。但是:
如果能够证明它们是不必要的,编译器可能会消除初始化。
即使成本很低,也绝对有可能在整个应用程序的环境中完全无关紧要。您可以使用分析器来量化性能效果。
它让您确信这三个字段将始终被初始化,从而消除某些类型的潜在错误。
答案 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
这样的操作将使用这样的(大概是便宜的)构造函数(否则操作会复制值,大概是更贵)。
我确信其他人可以提出其他原因。
最后,我将重点关注这一点。如果你确定(在适当的分析之后)你的构造函数是一个瓶颈(我非常怀疑它),那么担心改进它们。否则,你可能会浪费时间进行完全无关的纳米优化。
注意:的
我在回答这个问题时犯了两个大错误。我已经从答案中删除了它们。请查看此评论的历史记录以了解更多信息。