gcc结构体对齐
来源:互联网 发布:万彩动画大师 知乎 编辑:程序博客网 时间:2024/05/16 19:28
struct A a= //gcc支持的一种结构体赋值方式,好处是可以单独赋值
{ //结构体变量对齐存放,所以a的大小为8字节
.a=4,
.b=555,
}
// 定义类型的同时定义变量,s1是一个变量。
struct student
{
char name[20];
int age;
}s1;
// 将类型struct student重命名为s1,s1是一个类型名,不是变量
typedef struct student
{
char name[20];
int age;
}s1;
s.a = 12; // 编译器在内部还是转成指针式访问 int *p = s; *(p+0) = 12;
s.b = 44; // int *p = s; *(p+1) = 44;
s.c = 64; // int *p = s; *(p+2) = 44;
s1.a = 12; // int *p = (int *)&s1; *p = 12;
s1.b = 4.4; // double *p = (double *)(&s1 + 4); *p = 4.4;
s1.c = 'a'; // char *p = (char *)((int)&s1 + 12); *p = 'a';
struct stu
{ // 1字节对齐 4字节对齐
char sex; // 1 4(1+3)
int length; // 4 4
char name[10]; // 10 12(10+2)
};
---gcc支持但不推荐的对齐指令:#pragma pack() #pragma pack(n) (n=1/2/4/8)
(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虽然也可以不过不建议使用。
---gcc推荐的对齐指令__attribute__((packed)) __attribute__((aligned(n)))
(1)__attribute__((packed))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。packed的作用就是取消对齐访问。
(2)__attribute__((aligned(n)))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。它的作用是让整个结构体变量整体进行n字节对齐(注意是结构体变量整体n字节对齐,而不是结构体内各元素也要n字节对齐)
---参考阅读blog:
http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html
http://blog.csdn.net/sno_guo/article/details/8042332
{ //结构体变量对齐存放,所以a的大小为8字节
.a=4,
.b=555,
}
// 定义类型的同时定义变量,s1是一个变量。
struct student
{
char name[20];
int age;
}s1;
// 将类型struct student重命名为s1,s1是一个类型名,不是变量
typedef struct student
{
char name[20];
int age;
}s1;
s.a = 12; // 编译器在内部还是转成指针式访问 int *p = s; *(p+0) = 12;
s.b = 44; // int *p = s; *(p+1) = 44;
s.c = 64; // int *p = s; *(p+2) = 44;
s1.a = 12; // int *p = (int *)&s1; *p = 12;
s1.b = 4.4; // double *p = (double *)(&s1 + 4); *p = 4.4;
s1.c = 'a'; // char *p = (char *)((int)&s1 + 12); *p = 'a';
struct stu
{ // 1字节对齐 4字节对齐
char sex; // 1 4(1+3)
int length; // 4 4
char name[10]; // 10 12(10+2)
};
---gcc支持但不推荐的对齐指令:#pragma pack() #pragma pack(n) (n=1/2/4/8)
(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虽然也可以不过不建议使用。
---gcc推荐的对齐指令__attribute__((packed)) __attribute__((aligned(n)))
(1)__attribute__((packed))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。packed的作用就是取消对齐访问。
(2)__attribute__((aligned(n)))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。它的作用是让整个结构体变量整体进行n字节对齐(注意是结构体变量整体n字节对齐,而不是结构体内各元素也要n字节对齐)
---参考阅读blog:
http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html
http://blog.csdn.net/sno_guo/article/details/8042332
0 0
- gcc结构体对齐
- gcc c 关于结构体对齐
- Mingw-gcc结构体取消对齐
- gcc结构体对齐的误用
- GCC结构对齐小结
- gcc 中的"__attribute__ ((packed))" gcc移植,内存对齐.结构体对齐
- gcc 中的"__attribute__ ((packed))" gcc移植,内存对齐.结构体对齐-转
- GCC结构体内变量对齐
- Arm结构体gcc内存边界对齐问题(zt)
- gcc 中结构体(struct)内存对齐问题分析
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体字节对齐和位域对齐——VC、gcc
- 结构体对齐(内存对齐)
- 内存对齐.结构体对齐
- 内存对齐.结构体对齐
- 内存对齐.结构体对齐
- JS面向对象理解
- JVM内存模型
- 【Java】注解
- Java提供的部分常用包
- 分解质因数
- gcc结构体对齐
- hdoj-2017-字符串统计(解题报告)
- Action访问Servlet API(通过ActionContext类访问)
- 对链表数据归并排序
- linux查询系统,硬件信息命令
- C++继承详解
- js和java中数组的区别和定义方式
- 关于内嵌类
- leetcode微软谷歌面试题102. Binary Tree Level Order Traversal