Cha*_*son 1 c c++ compiler-optimization language-lawyer
两种流行的编译器(gcc、clang)在以下函数体中发出存储指令:
void foo(char x) {
*(char *)0xE0000000 = x;
}
Run Code Online (Sandbox Code Playgroud)
该程序可能在某些硬件架构上正常运行,其中写入的地址是内存映射 IO。
由于此访问是通过未限定为的指针执行的volatile,因此编译器是否需要在此处发出存储?足够积极的优化器可以合法地消除这个存储吗?我很好奇这个存储是否对抽象机构成了可观察到的副作用。
另外,C17 和 C++20 在这方面有什么不同吗?
C 标准不需要实现来发布存储,因为 C 2018 5.1.2.3 6 说:
\n\n\n一致实施的最低要求是:
\n\xe2\x80\x94 对易失性对象的访问严格按照抽象机的规则进行评估。
\n\xe2\x80\x94 在程序终止时,写入文件的所有数据应与根据抽象语义执行程序所产生的结果相同。
\n\xe2\x80\x94 交互设备的输入和输出动态应按照 7.21.3 的规定进行。这些要求的目的是尽快出现无缓冲或行缓冲的输出,以确保提示消息实际上在程序等待输入之前出现。
\n这是程序的可观察行为。
\n
这些都不包括对非易失性左值的赋值。
\n