请帮助我了解编译器/ OS如何响应在C下面的程序行,为同一行上的读取点访问的变量,操作系统将读取两次内存?
int c;
void task1()
{
c+=c; // This line is actually c=c+c; 2 read point 1 write
}
将内存中读取两倍或仅单次?
请帮助我了解编译器/ OS如何响应在C下面的程序行,为同一行上的读取点访问的变量,操作系统将读取两次内存?
int c;
void task1()
{
c+=c; // This line is actually c=c+c; 2 read point 1 write
}
将内存中读取两倍或仅单次?
这取决于处理器,编译器和编译器选项。对具有多重内存指令并与编译器,是不是在调试模式下你可能会产生的代码像
MULL2 #2, C
内存将被读取一次写入一次的处理器。在执行寄存器中所有操作的处理器上,您可能会得到如下所示的结果:
MOVL C, R3
MULL #2, R3
MOVL R3, C
问题中的代码是“c + = c”,而不是“c + = 1”。 – duskwuff
然后让我调整。 – user3344003
它取决于编译器生成的代码和CPU。编译器可能会将其优化为“c * = 2”或甚至“c << = 1”或完全不同的东西。您必须创建(优化版本)可执行文件并查看生成的代码。 –
无法保证对变量的访问次数。也不会将它存储在内存或寄存器中或存储在月球上。由于编译器也可以根本不产生任何代码。 – Olaf
对我来说,读一次到一个cpu寄存器,总结一下,写一次。但为了确保你必须找到传递给编译器的参数,以查看该代码的汇编转换 – RosLuP