硬件供应商报告了一种理论上的(非确定性,难以测试,从未在实践中出现)硬件问题,即对某些内存范围进行双字写入可能会破坏任何未来的总线传输。
虽然我的C代码中没有明确的双字写入,但我担心编译器允许(在当前或未来的实现中)将多个相邻的字分配合并为一个双字分配。
编译器不允许重新排序易失性分配,但不清楚(对我来说)合并是否算作重新排序。我的直觉是它是,但我之前曾被语言专家纠正过!
示例:
typedef struct
{
volatile unsigned reg0;
volatile unsigned reg1;
} Module;
volatile Module* module = (volatile Module*)0xFF000000u;
// two word stores, or one double-word store?
module->reg0 = 1;
module->reg1 = 2;
(我将单独向我的编译器供应商咨询此事,但我想知道标准的规范/社区解释是什么。)