【发布时间】:2021-02-07 23:25:55
【问题描述】:
联合或结构的全局变量的默认对齐方式是什么。它们是否保证字对齐?特别是在使用 GCC 和 SDCC 时。
在代码中,函数f()是安全的,还是会导致未对齐的访问? 16 位和 32 位平台有区别吗?
#define ADDR_SIZE 8
typedef union {
unsigned char u8[ADDR_SIZE];
} addr_t;
addr_t global_address;
void f(void) {
uint32_t x = *((uint32_t *)&global_address) + *((uint32_t *)&global_address + 1);
}
【问题讨论】:
-
使用编译指示来确保结构包。见HERE
-
“Word”这个词没有定义大小/宽度,所以在这里没有用。该标准不(不能)强加任何对齐。
-
Pragma 不是一个选项,因为根据项目规则,代码必须“独立于编译器”。
-
@kfx:所以你不能依赖任何对齐或结构填充等。听起来像一个 XY 问题。请说明您想要达到的目标。请注意,强制转换会调用未定义的行为和严格的别名违规。一般规则是不要投射,除非你真的需要它们并且你确切地知道它们的作用,包括所有含义!
-
@kfx,我认为 cmets 中没有任何不相关的内容。
标签: c memory-alignment