我在其他帖子中写过这个问题。虽然事实并非如此。
GCC编译器版本:4.8.3(适用于ARM)
代码摘录:
uint8_t data[4] __attribute__ ((aligned (8))) = {1,2,3,4};
int main()
{
uint32_t p = 0;
p = (uint32_t)&data[0];
p = (uint32_t)&data[1];
p = (uint32_t)&data[2];
p = (uint32_t)&data[3];
}
Run Code Online (Sandbox Code Playgroud)
请注意,数据位于任何函数之外,因此不会在堆栈中分配。
我看到的结果(调试时)是p:536870912, 536870913, 536870914, 536870915;
我期待这样的事情:536870912, 536870920, 536870928, 536870936
任何帮助将非常感激。
您告诉编译器在 8 字节边界上对齐数组。不是每个成员。简单的答案是 - 你不能使用标量数据类型来做到这一点,因为编译器不允许在数组元素之间放置任何填充(毕竟,*x++作为指向 uint8_t 的指针仍然应该只将指针增加 1)。
就像是
struct alignas(8) AL_BYTE{
uint8_t theByte;
}
struct AL_BYTE data[4] __attribute__ ((aligned (8))) = {{.theByte=1},....
Run Code Online (Sandbox Code Playgroud)
应该达到你想要的。
| 归档时间: |
|
| 查看次数: |
4802 次 |
| 最近记录: |