问题描述
我开始想出一些关于内存读写的基本思路(假设我们读写的数据还没有被缓存)。
对于以下代码:
int a = 1;
这绝对是写,因为我们将值“1”写入变量“a”的内存位置。
但是对于以下代码:
int a,b;
a = 1;
b = a;
当我们执行语句“b = a;”时,我们实际上是在执行一读一写吗? 根据我的理解,我认为是一读一写,因为我们必须先加载'a'的值,然后将值写入'b'。
不确定我的理解是否正确。请帮助我澄清这些基本想法。 非常感谢您的帮助。
解决方法
假设我们读取或写入的数据尚未缓存)
我不明白缓存与此有什么关系。
当我们执行语句“b = a;”时,我们实际上是在执行一读一写吗?
正确。
然而,C 不像汇编语言。 C 指令不会一对一地映射到机器指令。有the as-if rule。基本上,只要程序的可观察行为被保留,编译器就可以生成任何机器代码。
例如:
auto foo()
{
int a = 24;
int b = 11;
int c = a + b;
return c;
}
C 编译器可以随意编译以上内容
foo():
mov eax,35
ret
编译器确实会这样做(启用优化)。如您所见,没有内存读/写。只需写入 eax
寄存器(必须放置函数的返回值)。并且该值是一个中间值 (35
)。