我的情况是我有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
答案 0 :(得分:0)
你首先应该问这是否可能,如果是的话。
在这种情况下,答案是 no ,因为类的const数据成员必须由您或默认的初始化值初始化。
PS:这必须是过早优化的经典案例,因为初始化变量在时间上相对便宜。
答案 1 :(得分:0)
如果它只是一个int,你就无法真正节省时间。
如果它更复杂,请使用std::optional<T>
。初始化它非常便宜(如果空的话,单个位设置为0),您可以查询它是否已初始化,它只是内存中的一点开销,并且在运行时为零(如果已知为非空则取消引用没有if
在明智的优化实施中。)
extern bool ShouldInit;
struct Foo {
std::optional<MyExpensiveType> oMyStuff_;
Foo()
: oMyStuff(ShouldInit ? make_optional<MyExpensiveType>()
: std::nullopt) {}
int fn()
{
return oMyStuff_ ? *oMyStuff_
: 0;
}
};