2016-11-10 40 views
0

请帮助我了解编译器/ OS如何响应在C下面的程序行,为同一行上的读取点访问的变量,操作系统将读取两次内存?

int c; 

void task1() 
{ 
c+=c; // This line is actually c=c+c; 2 read point 1 write 
} 

将内存中读取两倍或仅单次?

+2

它取决于编译器生成的代码和CPU。编译器可能会将其优化为“c * = 2”或甚至“c << = 1”或完全不同的东西。您必须创建(优化版本)可执行文件并查看生成的代码。 –

+3

无法保证对变量的访问次数。也不会将它存储在内存或寄存器中或存储在月球上。由于编译器也可以根本不产生任何代码。 – Olaf

+0

对我来说,读一次到一个cpu寄存器,总结一下,写一次。但为了确保你必须找到传递给编译器的参数,以查看该代码的汇编转换 – RosLuP

回答

0

这取决于处理器,编译器和编译器选项。对具有多重内存指令并与编译器,是不是在调试模式下你可能会产生的代码像

MULL2 #2, C 

内存将被读取一次写入一次的处理器。在执行寄存器中所有操作的处理器上,您可能会得到如下所示的结果:

MOVL C, R3 
MULL #2, R3 
MOVL R3, C 
+0

问题中的代码是“c + = c”,而不是“c + = 1”。 – duskwuff

+0

然后让我调整。 – user3344003