假设我有以下代码:
volatile char array[4];
array[0] = 1;
现在,理想情况下,编译器会将其转换为 8 位存储指令,以便在内存中只修改一个字节。但是,是否可以免费将其转换为读/修改/写?例如,处理此问题的等效方法如下:
int32 *temp = (int*)array;
*temp = (*temp & 0xFFFFFF00) | 1;
问题显然是后一种实现将覆盖数组中的其他 3 个字节。在单线程应用程序中这是等价的,但在多线程情况下则不然。
那么编译器是否允许编译第一个实现与第二个实现相同?