结构体字节对齐,pragma pack,__attribute__(packed)
来源:互联网 发布:war3 mac 版本转换器 编辑:程序博客网 时间:2024/05/16 18:58
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏 蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。
例如我们设置结构体的对齐方式:
struct student
{
int age;
char c;
};
对于以上结构体,默认用sizeof输出大小为8字节,默认的字节对齐方式是4,当然我们也可以设置他的对齐 方式,如下:
#pragma pack(2) //(或 pragma(push,4))
struct student
{
int age,
char c;
};
#pragma pack(pop) //注意这个和push是成对用的
此时用sizeof输出大小是为6,因为对齐方式为2.如果设置对齐方式为1的话,sizeof输出大小则为5;
当然有时我们不希望编译器对结构体做对齐处理,而希望按照他原有的大小分配空间,这里就要用到 __attribute__((packed)) ,这个意思是告诉编译器不要做对齐处理。
struct Student
{
int age;
char c;
}__attribute__((packed));
int main()
{
struct Student S;
printf("%d\n",sizeof(S));
}
输出大小为 5,其实和一字节对齐方式一样。
到这里可能许多人和我刚开始一样不理解这个__attribute__((packed)) 是个什么东东,这个其实是GUN C 的一大特色,是一种机制,他可以设置函数属性,变量属性,类型属性,packed就是个类型属性。
当然__attribute__还可以用来设置字节对齐属性。
__attribute__((aligned(4)));设置4字节对齐方式,和#pragma pack(4) 效果一样,我的总结大概就是这 些,希望对大家有用,么么哒。
输出大小依次为:5,8,5
写到这里顺便再补充一下,通常在跨平台的基于数据结构的网络通信的时候特别要注意字节的对齐方式,以为在不同的系统中,某些类型的大小不一样。
short int long long long ptr time_t
32位 2 4 4 8 4 4
64位 2 4 8 8 8 8
在定义通信用的结构体时,应该考虑使用定常的数据类型,如uint32_t,4字节的固定长度
- 结构体字节对齐,pragma pack,__attribute__(packed)
- 结构体字节对齐,pragma pack,__attribute__(packed)
- 数据结构对齐, #pragma pack 和 __attribute__((packed))
- vc下和gcc的结构体紧凑对齐格式存储【#pragma pack(push,1)、__attribute__ ((packed, aligned(1)))】
- __attribute__ ((packed))字节对齐
- __attribute__ ((packed))字节对齐
- 字节对齐 __attribute__((packed))
- 使结构体紧凑对齐:__attribute__ ((packed))
- struct 结构体 、 union 枚举 及 #pragma pack 字节对齐
- __packed、#pragam pack()、 __attribute__(aligned(n))、 __attribute__(packed(n))字节对齐
- 字节对齐 #pragma pack
- #pragma pack字节对齐
- pragma pack,字节对齐
- 字节对齐#pragma pack
- 字节对齐 pragma pack
- #pragma pack,__attribute__选项和结构体对齐相关问题详解
- #pragma pack()改变结构中字节对齐方式
- #pragma pack 结构体对齐编译器选项
- 统计学习方法笔记三----逻辑斯蒂
- mybatis入门学习
- Android6.0 项目是512M以下的低内存设备,为什么没有多用户选项?
- 简析全双工与半双工的区别
- delphi2007+win10 "c:\Windows\Microsft.NET...\Borland.Delphi.Targets" was not found
- 结构体字节对齐,pragma pack,__attribute__(packed)
- 原生js轮播图
- 使用MD中控件实现APP页面折叠
- 用vc编译gettext
- js图片轮播2
- php if与switch区别
- java 企业网站源码模版 屏幕自适应 有前后台 springmvc SSM 生成静态化
- 几种不同程序语言的HMM版本
- IDEA配置