C语言字节序对齐以及空间利用率
来源:互联网 发布:织梦tag标签伪静态 编辑:程序博客网 时间:2024/06/02 02:53
环境:ubuntu 64bit gcc vim
#include <signal.h>#include <math.h>#include <stdio.h>#include <stdint.h>#include <string.h>#include <unistd.h>#include <stdbool.h>typedef struct student{ int uid; char* name; char nick;}Stu;int main(int argc,char* argv[]){ Stu stu1; printf("sizeof(stu1) = %lu\n",sizeof(stu1)); return 0;}
运行结果:
代码分析:
sizeof()函数是求变量的字节数,这里stu1是一个Stu变量,Stu包含三个成员分别是:int,char*,char,理论上sizeof(stu1) = 4 + 8 + 1 = 13为什么实际结果确实24呢?
这是因为声明变量时有一个字节序对齐问题,char* 的长度是64位系统的地址长度,即8个字节,也就是cpu向内存每次取8个字节,这也是为了提高效率,标准的用空间换取时间.当然牺牲空间的同时,也对其进行优化,比如类型的大小对齐.比如 char型那么它的地址可以是任意位置,int型变量地址只能是0,4,8即4的倍数,double类型地址只能是0,8,16即8的倍数,另外这里的变量其实地址到自己的字节大小都属这个变量,也就是说int型变量0到3之间都属于它,这中间不能在有其他数,而且他们的顺序遵循定义时的相对顺序.
那么在内存中(假设起始地址为0)& uid = 0x0000-0x0003, *name = 0x0008-0x000f,&nick = 0x0100,中间的没用利用的空间都会浪费掉.其中0x0000-0x000f为16个字节,0x0100属于下一次取址区间,而每次取址为8字节,加起来就是24字节.
其实这里我们可以进行优化,把字节小的类型放前面,比如:
#include <signal.h>#include <math.h>#include <stdio.h>#include <stdint.h>#include <string.h>#include <unistd.h>#include <stdbool.h>typedef struct student{ char nick; int uid; char* name;}Stu;int main(int argc,char* argv[]){ Stu stu1; printf("sizeof(stu1) = %lu\n",sizeof(stu1)); return 0;}
这样就会提高内存利用率;
上面代码所占内存&nick = 0x0000,&uid = 0x0004-0x0007,*name = 0x0008-0x000f,共计16字节
运行结果:
字节对齐相关
这里我们还可以计算他的空间里用率为13/16,上一定义格式空间里用率为13/24.
那么我们有没有办法让它空间里用率为100%呢,答案是可以的.我们让它对齐格式为1个字节对齐就可以了.
代码:
#include <signal.h>#include <math.h>#include <stdio.h>#include <stdint.h>#include <string.h>#include <unistd.h>#include <stdbool.h>#pragma pack(1)typedef struct student{ char nick; int uid; char* name;}Stu;int main(int argc,char* argv[]){ Stu stu1; printf("sizeof(stu1) = %lu\n",sizeof(stu1)); return 0;}
#pragme pack(n) 这里的n表示对齐字节数.
运行结果:
这里的空间利用率是100%,那么他的取址是不是一次取一个字节呢?网上查资料只是说效率会变慢.
以上是我在做项目时发现的问题,经过查资料得出结果拿出来和大家分享下,以上纯属个人理解,如果发现有错请在下方评论,方便我及时更正.
- C语言字节序对齐以及空间利用率
- C语言字节对齐
- C语言字节对齐
- c语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- c语言字节对齐
- C语言字节对齐
- c语言字节对齐
- 新浪实时股票数据接口http://hq.sinajs.cn/list=code
- shadowsock configue lesson
- python杂列表
- [转]GCC编译过程分解
- MFC 批量查找替换文件内容
- C语言字节序对齐以及空间利用率
- session 与 cookie的区别及原理
- java--string 操作
- 数组与集合的应用之数组排序与查询(使用快速排序法)
- 在一个范围内获取随机时间
- php session方案
- import,reload,__import__在python中的区别
- Linux脚本的执行方式解析
- 数组与集合的应用之数组排序与查询(使用直接插入法)