c - GCC __attribute__ ((对齐 (8))) 不起作用

标签 c gcc

我在其他帖子中写过这个问题。虽然事实并非如此。

GCC compiler version: 4.8.3 (for 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];
}

请注意,数据位于任何函数之外,因此它在堆栈中分配。

我看到(调试时)p 的结果是:536870912, 536870913, 536870914, 536870915;

我期待这样的结果:536870912, 536870920, 536870928, 536870936

任何帮助将不胜感激。

最佳答案

您告诉编译器在 8 字节边界上对齐数组不是每个成员。简单的答案是 - 您不能使用标量数据类型来做到这一点,因为编译器不允许在数组元素之间放置任何填充(毕竟,作为指向 uint8_t 的指针仍应仅递增指针1)。

类似于

struct alignas(8) AL_BYTE{
   uint8_t theByte;
}
struct AL_BYTE data[4] __attribute__ ((aligned (8))) = {{.theByte=1},....

应该达到你想要的。

关于c - GCC __attribute__ ((对齐 (8))) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36261440/

相关文章:

c - FIN扫描程序设计难点

c - __func__ 和 __PRETTY_FUNCTION__ 并不总是展开

c - 弱链接的可移植性如何? #pragma weak my_symbol

android - __attribute__((used)) 在将静态库链接到共享对象时无效(android gcc 4.8)

c - 64 位比较和交换 (CAS) 应该在 32 位机器上工作吗? (或 64 位机器?)

c - c函数原型(prototype)不匹配仅仅是一个警告吗

c - 将 void* 类型传递给 main() 函数

c++ - "atomic object"的定义

objective-c - NSUInteger 的奇怪行为 - 无法正确转换为 float

c++ - 可能不是那么经典的 gcc/g++ 文件错误