我有以下定义:
static char xxxx;
static uint8_t y;
我在内存映射中得到以下几行:
.bss._ZZL7createXvE4xxxx 0x200024c0 0x1
.bss._ZZL7createXvE11y 0x200024c1 0x1
如果我将其更改为以下内容:
static char xxxx;
static uint8_t y[1];
我在内存映射中得到以下几行:
.bss._ZZL7createXvE4xxxx 0x200024c0 0x1
fill 0x200024c1 0x3
.bss._ZZL7createXvE11y 0x200024c4 0x1
GCC 始终会对齐数组的起始地址,这是众所周知的行为吗?
如上所述,期望相同的结果,但结果不同
作为更新,当我在 GCC 网站上询问时得到以下答复:
“它不是 ABI 的一部分,但对齐数组可以带来性能优势,例如当代码被矢量化时。在实践中不可能轻易地准确判断数组有多大,因此即使非常小的数组也会对齐。
对于标量对象执行此操作是没有意义的,因为下一个位置永远不能包含相关对象。”