C语言之gcc中支持的内存对齐指令
2016-10-13 22:34
323 查看
1:gcc中支持但不推荐使用的指令
#pragma pack() :取消内存对齐访问
#pragma pack(n) (n=1/2/4/8):按n字节对齐
分析:
(1)#pragma是用来指挥编译器,或者说设置编译器的对齐方式的。编译器的默认对齐方式是4,但是有时候我不希望对齐方式是4,而希望是别的(譬如希望1字节对齐,也可能希望是8,甚至可能希望128字节对齐)。
(2)常用的设置编译器编译器对齐命令有2种:第一种是#pragma pack(),这种就是设置编译器1字节对齐(有些人喜欢讲:设置编译器不对齐访问,还有些讲:取消编译器对齐访问);第二种是#pragma pack(4),这个括号中的数字就表示我们希望多少字节对齐。
(3)我们需要#prgama pack(n)开头,以#pragma pack()结尾,定义一个区间,这个区间内的对齐参数就是n。
(4)#prgma pack的方式在很多C环境下都是支持的,但是gcc虽然也可以不过不建议使用。
2:gcc推荐的指令
__attribute__((packed)):取消内存对齐,或者说是1字节对齐
__attribute__((aligned(n))):设定结构体类型整体按n字节对齐,注意是整体而不是这个结构体变量内的元素按n字节对齐
这样mystruct2这个结构体类型就按2字节对齐
(1)__attribute__((packed))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。packed的作用就是取消对齐访问。
(2)__attribute__((aligned(n)))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型(只能是加在类型后面,不能加在变量后面)。它的作用是让整个结构体变量整体进行n字节对齐(注意是结构体变量整体n字节对齐,而不是结构体内各元素也要n字节对齐)
结构体对齐访问还可以参考下面两篇文章
http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html
http://blog.csdn.net/sno_guo/article/details/8042332
#pragma pack() :取消内存对齐访问
#pragma pack(n) (n=1/2/4/8):按n字节对齐
#pragma pack(2) struct mystruct1 { int a; char b; short c; } struct mystruct2 { int a;; double b; short c; } #pragma pack()以上这部分内容就是按2字节对齐了。
分析:
(1)#pragma是用来指挥编译器,或者说设置编译器的对齐方式的。编译器的默认对齐方式是4,但是有时候我不希望对齐方式是4,而希望是别的(譬如希望1字节对齐,也可能希望是8,甚至可能希望128字节对齐)。
(2)常用的设置编译器编译器对齐命令有2种:第一种是#pragma pack(),这种就是设置编译器1字节对齐(有些人喜欢讲:设置编译器不对齐访问,还有些讲:取消编译器对齐访问);第二种是#pragma pack(4),这个括号中的数字就表示我们希望多少字节对齐。
(3)我们需要#prgama pack(n)开头,以#pragma pack()结尾,定义一个区间,这个区间内的对齐参数就是n。
(4)#prgma pack的方式在很多C环境下都是支持的,但是gcc虽然也可以不过不建议使用。
2:gcc推荐的指令
__attribute__((packed)):取消内存对齐,或者说是1字节对齐
__attribute__((aligned(n))):设定结构体类型整体按n字节对齐,注意是整体而不是这个结构体变量内的元素按n字节对齐
struct mystruct1 { int a; char b; short c; }__attribute__((packed));这样这个结构体类型就按1字节对齐,所以这个结构体类型占7字节
struct mystruct2 { int a; char b; short c; }__attribute__((aligned(2))) mystr2;(不能是mystr2 __attribute__((aligned(2))) )
这样mystruct2这个结构体类型就按2字节对齐
(1)__attribute__((packed))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。packed的作用就是取消对齐访问。
(2)__attribute__((aligned(n)))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型(只能是加在类型后面,不能加在变量后面)。它的作用是让整个结构体变量整体进行n字节对齐(注意是结构体变量整体n字节对齐,而不是结构体内各元素也要n字节对齐)
结构体对齐访问还可以参考下面两篇文章
http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html
http://blog.csdn.net/sno_guo/article/details/8042332
相关文章推荐
- 内存对齐指令
- c语言中的内存对齐
- C语言内存分配示例 与 字节对齐示例
- C语言:内存字节对齐详解(转)
- [B原创] Arm/x86结构体gcc内存边界对齐问题
- 解析C语言中的sizeof ,重点介绍内存对齐
- C语言:内存字节对齐详解
- C语言:内存字节对齐详解(转载)
- C语言:内存字节对齐详解[转载]
- C语言 内存对齐
- C语言的内存的字节对齐的理解及其运用
- C语言:内存字节对齐详解
- gcc 中的"__attribute__ ((packed))" gcc移植,内存对齐.结构体对齐
- C语言:内存字节对齐详解[转载]
- C语言:内存字节对齐详解
- C语言:内存字节对齐详解[转载]
- (转载)C语言:内存字节对齐详解
- Arm结构体gcc内存边界对齐问题(zt)
- c语言中结构体的大小和内存对齐问题
- C语言的内存对齐问题