GCC for ARM 中数组的内存对齐

问题描述 投票:0回答:1

我有以下定义:

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 arm alignment stm32 cortex-m
1个回答
0
投票

作为更新,当我在 GCC 网站上询问时得到以下答复:

“它不是 ABI 的一部分,但对齐数组可以带来性能优势,例如当代码被矢量化时。在实践中不可能轻易地准确判断数组有多大,因此即使非常小的数组也会对齐。

对于标量对象执行此操作是没有意义的,因为下一个位置永远不能包含相关对象。”

© www.soinside.com 2019 - 2024. All rights reserved.