字节对齐的方法
来源:互联网 发布:华腾软件学院 编辑:程序博客网 时间:2024/06/07 19:42
一、__attribute__选项
我们可以按照自己设定的对齐大小来编译程序,GNU使用__attribute__选项来设置,比如我们想让刚才的结构按一字节对齐,我们可以这样定义结构体
struct stu{
char sex;
int length;
char name[10];
}__attribute__ ((aligned (1)));
struct stu my_stu;
则sizeof(my_stu)可以得到大小为15。
上面的定义等同于
struct stu{
char sex;
int length;
char name[10];
}__attribute__ ((packed));
struct stu my_stu;
__attribute__((packed))得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐.
二、#pragma pack (n)
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
另外,还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
举例说明
例1
struct test
{
char x1;
short x2;
float x3;
char x4;
};
由于编译器默认情况下会对这个struct作自然边界(有人说“自然对界”我觉得边界更顺口)对齐,结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然边界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大边界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。
例2
#pragma pack(1) //让编译器对这个结构作1字节对齐
struct test
{
char x1;
short x2;
float x3;
char x4;
};
#pragma pack() //取消1字节对齐,恢复为默认4字节对齐
这时候sizeof(struct test)的值为8。
- 字节对齐的方法
- 字节对齐的简单方法
- 字节对齐的探讨
- 字节对齐的问题
- 字节对齐的探讨
- 字节对齐的作用
- 字节对齐的问题
- 字节对齐的处理
- 通俗易懂的字节对齐
- 字节对齐的问题
- 字节对齐的问题
- 字节对齐的规则
- 字节对齐的作用
- 字节的对齐方式
- 字节对齐的讲解
- 字节对齐的计算
- 字节对齐的算法
- 字节的对齐原理
- 图像语义分割
- 开源大数据周刊-第67期
- PAT 1021. Deepest Root (25)
- Android获取View的宽度和高度
- Java设计模式之简单工厂模式
- 字节对齐的方法
- HGDB重建模板数据库的方法(适用于PG)
- 7 局部求和
- 美女头像这么多,他们用大数据告诉你哪个是骗子
- 搭建java环境\Tomcat安装和基本配置\Tomcat_MSM
- Windows中Django安装教程
- C#枚举类型的默认值一定是0说起
- KMP字符匹配
- TCP/IP的开肠破肚(1)