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