- 访问必须具有地址的变量; - 访问不一定具有地址的变量。
例如,如果您看下面这段代码片段:
void sleepingbeauty()
{
int i = 1;
while (i) sleep(1);
}
自从
i
是一个局部变量后,我认为编译器可以将其优化掉,让沉睡的美人永远安眠。void onedaymyprincewillcome(int* i);
void sleepingbeauty()
{
int i = 1;
onedaymyprincewillcome(&i);
while (i) sleep(1);
}
由于i
是一个本地变量,但其地址被获取并传递给另一个函数,我认为我的编译器现在会知道它是一个“可寻址”的变量,并生成内存读取以确保也许有一天王子会来。
int i = 1;
void sleepingbeauty()
{
while (i) sleep(1);
}
由于 i
是全局变量,我假设我的编译器知道该变量有一个地址,并会生成对它的读取而不是缓存该值。
void sleepingbeauty(int* ptr)
{
*ptr = 1;
while (*ptr) sleep(1);
}
我希望解引用运算符足够明确,以便我的编译器在每次循环迭代中生成内存读取。
我相当确定这是当前所有C和C++编译器使用的内存访问模型,但我认为没有任何保证。事实上,C++03甚至对线程的存在都视而不见,因此如果考虑标准,这个问题甚至没有意义。不过我不确定C是否也是如此。
是否有一些文件可以指定我是正确还是错误的?我知道这些可能不是基于标准的理由,但这对我来说似乎是一个重要的问题。
除了编译器生成读取之外,我还担心CPU缓存可能会保留过时的值,即使我的编译器尽力产生读写操作,值也从未在线程之间同步。这种情况可能发生吗?