假设有一个程序:
int aaa;
class b {
int bb;
public:
b(){}
};
b bbb;
int main(){
return 0;
}
如您所知,在启动 main 之前,零将写入变量“aaa”。
问题:
- 将零写入“bbb”对象的“bb”字段吗?
- 会在对象“bbb”上调用“b”类的空构造函数吗?还是翻译器会抛出对空构造函数的调用?
PS这个问题不是闲着的。我们需要了解是否可以避免对静态对象进行强制归零,从而加快主函数的启动速度。
UPD1:
看起来需要做一些澄清。
这个问题与嵌入式系统的操作有关。也就是说,在这种系统中,代码被硬连线到 ROM 中并从 ROM 开始。在这样的系统中,不可能在启动时初始化静态变量,因为代码存在于 ROM 中,并且在启动时 RAM 中有垃圾。也就是说,没有
bbb:
.zero 4
aaa:
.zero 4
在这样的系统中不滚动。正是在 main 之前,必须运行单独的代码将静态变量重置为零。同时,如果重置静态变量的代码耗时过长,那么这也是不好的。有一次我与能源领域保护系统的开发人员进行了交谈。他们有一个要求,上电后保护开始工作的时间不迟于50Hz工频的半个周期,即不迟于10毫秒(如果线路短路挂断设备,则关闭设备)。如果电源打开,并且处理器用零填充静态变量而不是工作,那么这不是很好。
因此,问题出现了——如何控制将静态变量归零的过程以及是否可以使用具有空构造函数的类来完成。至少对于 GCC 和 clang 来说,这似乎是不可能的。
这里很大程度上取决于实施。在上面的例子中,变量没有以任何方式被使用,并且它们的初始化没有副作用,所以它们可以被编译器安全地抛出。如果它们仍然被使用,那么
main: