__attribute__((align(n)))字节对齐问题,作用和#pragma不一致

aTimer 2017-09-27 12:23:36
问题:#pragma pack(n) #pragma pack() 对字节对齐的作用已经掌握了,网上搜索得知__attribute__((align(n)))有同样功效,但是经过写小程序出现以下现象:
1.#pragma pack(n), 如果n大于此结构体中最大基本数据类型size,那么依据最大基本数据类型size对齐;否则,依据n进行对齐;#pragma pack() 用来取消默认对齐方式,默认对齐依据最大基本数据类型size进行对齐。
2.__attribute__((align(n))), 如果n大于此结构体中小大基本数据类型size,那么依据最大基本数据类型size对齐;否则,依据n进行对齐;__attribute__((packed))用来取消对齐优化,即默认单字节对齐,注意不等同于__attribute__((align(1)))。
3.假设一个结构体是:
struct A{
unsigned long a;
unsigned long b;
}__attribute__((align(8)));
另一个结构体是:
struct B{
char a;
unsigned long b;
unsigned short c;
char d;
}__attribute__((align(8)));
则sizeof( A ) = 8; sizeof( B ) = 16;
以上,请问__attribute__((align(n)))到底真实意义是什么?而A和B都是同样大小的结构体,为什么结果不同?

已查到的资料:
#pragma告诉编译器结构体或类内部的成员变量相对于第一个变量的地址的偏移量的对齐方式,缺省情况下,编译器按照自然边界对齐,当变量所需的自然对齐边界比n大 时,按照n对齐,否则按照自然边界对齐;后者告诉编译器一个结构体或者类或者联合或者一个类型的变量(对象)分配地址空间时的地址对齐方式。

也就是说,如 果将__attribute__((aligned(m)))作用于一个类型,那么该类型的变量在分配地址空间时,其存放的地址一定按照m字节对齐(m必 须是2的幂次方)。并且其占用的空间,即大小,也是m的整数倍,以保证在申请连续存储空间的时候,每一个元素的地址也是按照m字节对齐。 __attribute__((aligned(m)))也可以作用于一个单独的变量。
...全文
972 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aTimer 2017-09-28
  • 打赏
  • 举报
回复
对这个问题有不同意见的可以发我邮箱交流,就此结贴,谢谢大家。
自信男孩 2017-09-27
  • 打赏
  • 举报
回复
struct B{
    char a;
    unsigned long b;
    unsigned short c;
    char d;
}__attribute__((align(8)));
8字节对齐,a 和 b不足8个字节,补3个字节;c和d不足8个字节,补5个字节 个人理解
aTimer 2017-09-27
  • 打赏
  • 举报
回复
第一次发帖,各位技术大咖求教育0 0
赵4老师 2017-09-27
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
aTimer 2017-09-27
  • 打赏
  • 举报
回复
struct D{
        char a;
        char b;
        char c;
        char d;
        char e;
        char f;
        char l;
        char m;
}__attribute__((aligned(8)));
发现一个有趣现象,如果结构体内都是相同类型变量的就会一直叠加,直到发现不同基本类型变量,开始进行字节对齐计算;毫无意外,sizeof( D ) = 8;
aTimer 2017-09-27
  • 打赏
  • 举报
回复
三楼是说attribute按相邻两个元素一起对齐么,可是我写了下面这个结构体C,sizeof( C ) = 8; struct C{ unsigned short a; unsigned short b; unsigned short c; unsigned short d; }__attribute__((aligned(8)));

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧