【发布时间】:2018-03-11 20:34:55
【问题描述】:
我有一种情况,我有一个const 成员变量,但在某些控制路径中我可以保证我不会访问它。在这些情况下,当我构造对象时,我不想浪费时间初始化该成员。
考虑以下玩具示例:
struct Foo {
int val;
Foo() {}
};
auto function() { return Foo(); }
这会产生所需的程序集(Clang 5.0.0 -O3):
function(): # @function()
ret
但是,如果我按照我的意愿将int val; 更改为int const val;,编译将失败(因为必须初始化const 成员):
struct Foo {
int const val;
Foo() {} //<- Fails! `const` members must be initialized.
};
如何初始化int const val;,但又不增加任何运行时成本?例如,我应该如何修复上例中的标记线?
注意:默认初始化 val(即使用 Foo() : val() {} 或 Foo() = default;)是不可接受的,因为这会将 val 初始化为零:
function(): # @function()
xor eax, eax
ret
【问题讨论】:
-
您真的处于无法接受
xor eax, eax的情况吗?如果是这样,那具体是什么情况? -
在一个可怜的、糟糕的
int的情况下,需要使用世界上最精确的原子钟来测量未初始化上述@987654337的增益(如果有的话) @。只需将其初始化为零,然后继续处理更紧迫的问题。对于更昂贵的对象,std::optional将是可能的解决方案。 -
@NeilButterworth 正如我所写,这是一个玩具示例。 IRL,
val可能是一个实际的对象,在这种情况下开销可以任意大。
标签: c++ oop constructor initialization constants