Gcc 编译器对内存对象相对位置的假设

Gcc 编译器对内存对象相对位置的假设,gcc,compilation,clang,compiler-optimization,Gcc,Compilation,Clang,Compiler Optimization,我想知道编译器对内存对象的相对位置做了什么假设 例如,如果我们分配两个堆栈变量,每个变量大小为1字节,然后一个接一个地将它们初始化为零,那么编译器是否可以通过只发出一条指令,用零覆盖内存中的两个字节来优化这种情况,因为编译器知道两个变量的相对位置 我特别感兴趣的是更知名的编译器,如gcc、g++、clang、Windows C/C++编译器等。编译器可以将多个赋值优化为一个 a = 0; b = 0; 可能会变成 *(short*)&a = 0; 微妙的部分是“如果我们分配两个堆栈变

我想知道编译器对内存对象的相对位置做了什么假设

例如,如果我们分配两个堆栈变量,每个变量大小为1字节,然后一个接一个地将它们初始化为零,那么编译器是否可以通过只发出一条指令,用零覆盖内存中的两个字节来优化这种情况,因为编译器知道两个变量的相对位置

我特别感兴趣的是更知名的编译器,如gcc、g++、clang、Windows C/C++编译器等。

编译器可以将多个赋值优化为一个

a = 0;
b = 0;
可能会变成

*(short*)&a = 0;
微妙的部分是“如果我们分配两个堆栈变量,每个变量的大小为1字节,一个接一个”,因为您无法真正做到这一点。编译器可以随意改变堆栈位置。此外,简单地声明变量并不一定意味着任何堆栈分配。变量可能只是在寄存器中。在C语言中,您必须使用alloca,即使这样也不能提供“紧接着另一个”


更一般的是,C标准不允许您比较不同对象的内存位置。这是未定义的行为。

可以吗?当然可以。会吗?试一试。如果C标准将此定义为未定义行为,例如gcc是否符合该标准且未使用类似的优化?@user2600312如果使用类似代码,则为未定义行为。如果编译器知道它将要工作,它可以做到这一点,因为它以特定的方式为特定的目标编译,它可以使它工作。