我想知道编译器对内存对象的相对位置做了什么假设。
例如,如果我们分配两个大小为1字节的堆栈变量,一个接一个地并且用零来初始化它们,编译器可以通过仅发出一个用零覆盖内存中的两个字节的单个指令来优化这种情况,因为编译器知道两个变量的相对位置吗?
我特别感兴趣的是更知名的编译器,如gcc,g ++,clang,Windows C / C ++编译器等。
答案 0 :(得分:1)
编译器可以将多个分配优化为一个。
a = 0;
b = 0;
可能会变成
*(short*)&a = 0;
微妙的部分是"如果我们分配两个大小为1字节的堆栈变量,就在另一个#34;因为你不能真的这样做。编译器可以随意改变堆栈位置。另外,简单地声明变量并不一定意味着任何堆栈分配。变量可能只是在寄存器中。在C中,您必须使用alloca
,即使这样也不会提供"正好在另一个"。
更一般地说,C标准不允许您比较不同对象的内存位置。这是未定义的行为。