__packed 关键字 的作用
来源:互联网 发布:建筑设计软件 编辑:程序博客网 时间:2024/05/22 14:48
在移植机智云的代码时,因为结构体里用了太多的变量,为了节省ram空间 所以加了个__packed关键字修饰。
举个例子:
struct {
char a; //1byte
int b; //4byte
char c[2] //2byte
double d; //8byte
}Struct_A;
在计算机内存中,结构体变量的存储通常是按字长对齐的,比如8位机里就按字节对齐,那么上述结构体共占用1+4+2+8=15byte。
在16位机里,变量就按照2字节对齐,比如a这个成员,虽然是个char类型,地址在0x80000000本身只占1字节,但是下一个成员b却不能使用0x80000001这个地址,而必须使用0x80000002,这就是按字长对齐。以上结构体占用的空间也就是2+4+2+8=16字节
同理,在32位机中,如果a在0x80000000的话,b只能放在0x80000004,因为这里的字长是4个字节。以上结构体占用空间4+4+4+8=20字节
也就是说总有一些字节是浪费掉的,这样做的目的很简单,就是因为在大多数计算机体系结构中,对内存操作时按整字存取才能达到最高效率,相当于是以空间换取时间。当然在某些计算机体系结构中,比如ARM,是支持非对齐字传输的,也就是说变量并不一定要按照字长对齐,尽管这样可能会降低效率,但换来的是存储空间上的节约。在mdk中加上__packed关键字,可以得到非对齐字的紧凑型结构体,则会强制编译器将结构体成员按1字节对齐,则以上结构体占用空间仍为15字节。
struct {
char a; //1byte
int b; //4byte
char c[2] //2byte
double d; //8byte
}Struct_A;
在计算机内存中,结构体变量的存储通常是按字长对齐的,比如8位机里就按字节对齐,那么上述结构体共占用1+4+2+8=15byte。
在16位机里,变量就按照2字节对齐,比如a这个成员,虽然是个char类型,地址在0x80000000本身只占1字节,但是下一个成员b却不能使用0x80000001这个地址,而必须使用0x80000002,这就是按字长对齐。以上结构体占用的空间也就是2+4+2+8=16字节
同理,在32位机中,如果a在0x80000000的话,b只能放在0x80000004,因为这里的字长是4个字节。以上结构体占用空间4+4+4+8=20字节
也就是说总有一些字节是浪费掉的,这样做的目的很简单,就是因为在大多数计算机体系结构中,对内存操作时按整字存取才能达到最高效率,相当于是以空间换取时间。当然在某些计算机体系结构中,比如ARM,是支持非对齐字传输的,也就是说变量并不一定要按照字长对齐,尽管这样可能会降低效率,但换来的是存储空间上的节约。在mdk中加上__packed关键字,可以得到非对齐字的紧凑型结构体,则会强制编译器将结构体成员按1字节对齐,则以上结构体占用空间仍为15字节。
如果编译器不支持__packed关键字,将其定义为空宏即可 #define __packed
阅读全文
0 0
- __packed 关键字 的作用
- __packed引起的问题
- 关键字static的作用
- volatile关键字的作用
- sealed关键字的作用
- transient关键字的作用
- transient关键字的作用
- partial关键字的作用
- 关键字static的作用
- 关键字explicit的作用
- 关键字的作用
- static关键字的作用
- __noop关键字的作用
- static关键字的作用
- finale 关键字的作用
- static关键字的作用
- explicit关键字的作用
- volatile关键字的作用
- 关于vue的知识点
- UVA 10763 Foreign Exchange
- java 基础题 很基础, 很有趣
- Qt 学习之路 2(74):线程和 QObject
- IPC通信
- __packed 关键字 的作用
- 本地spark测试tomcat日志处理
- chapter6:概率及朴素贝叶斯--朴素贝叶斯
- android:kotlin语言使用greendao3.0简解
- 【译文】伪标签学习导论
- springmvc学习笔记(4)-前端控制器
- 白话空间统计之二十五:空间权重矩阵(四)R语言中的空间权重矩阵(4):K临近
- 【实践】通用文件系统的quota时间
- 求a的b次方,不用考虑大数问题,不使用库函数