【发布时间】:2019-03-08 10:03:04
【问题描述】:
在运行时初始化成员变量而不引用/使用它会进一步占用 RAM,还是编译器只是忽略该变量?
struct Foo {
int var1;
int var2;
Foo() { var1 = 5; std::cout << var1; }
};
在上面的示例中,成员 'var1' 获取一个值,然后将其显示在控制台中。但是,根本不使用“Var2”。因此,在运行时将其写入内存会浪费资源。编译器是否考虑到这些情况并简单地忽略未使用的变量,或者 Foo 对象总是相同的大小,而不管其成员是否被使用?
【问题讨论】:
-
这取决于编译器、架构、操作系统和使用的优化。
-
有大量的低级驱动程序代码专门添加无操作结构成员以进行填充以匹配硬件数据帧大小,并作为获得所需内存对齐的技巧。如果编译器开始优化这些,就会有很多损坏。
-
@Andy 他们并不是真的什么都不做,因为评估了以下数据成员的地址。这意味着这些填充成员的存在确实对程序有可观察的行为。在这里,
var2没有。 -
如果编译器可以优化它,我会感到惊讶,因为任何寻址这种结构的编译单元都可能链接到使用相同结构的另一个编译单元,并且编译器不知道单独编译是否单位地址成员与否。
-
@geza
sizeof(Foo)不能根据定义减少 - 如果您打印sizeof(Foo)它必须产生8(在常见平台上)。编译器可以在他们认为合理的任何上下文中优化var2使用的空间(无论是通过new还是在堆栈上或在函数调用中...),即使没有 LTO 或整个程序优化。在不可能的情况下,他们不会这样做,就像几乎任何其他优化一样。我相信对已接受答案的修改大大降低了被它误导的可能性。