c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率
环境:ubuntu 64bit gcc vim
#include
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
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
#include
#include
#include
#include
#include
#include
#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语言字节序对齐以及空间利用率
环境:ubuntu 64bit gcc vim #include <signal.h> #include <math.h> #include <stdio.h> # ...
- 大小端字节序介绍以及判断当前环境字节序的程序【C语言】
文章目录 1.大小端字节序介绍 2. 判断当前环境的字节序程序 1.大小端字节序介绍 首先我们先来介绍什么是大端字节序,什么是小端字节序: 大小端字节序指的是数据在电脑上存储的字节顺序 小端字节序存储 ...
- 字节序、大端字节序(Big Endian)、小端字节序(Little Endian)总结
什么是字节序? 字节序,简单来说,指的是 超过一个字节的数据类型在内存中存储的顺序 有几种字节序? 大端字节序(Big Endian) 高位字节数据存放在内存低地址处,低位字节数据存放在内存高地址处. ...
- c语言中不能编译,为什么`int;`可以在C语言中很好地编译,而在C ++中却不能?
考虑以下程序(请参见此处的现场演示). #include int main(void) { int ; // Missing variable name puts("Surprise&qu ...
- c语言中函数名可不可以由用户命名,C语言中变量名及函数名的命名规则与驼峰命名法...
在程序设计中,变量名.函数名.数组名等统称为标识 符.简单地说,标识符就是一个名字.除库函数的函数名由系统定义外,其余都由用户自定义.C语言规定,标识符只能由字母(a-z,A-Z).数字 (0-9). ...
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutputStream用法)
Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...
- Java字节序,java整型数与网络字节序 byte[] 数组转换关系
Java字节序 http://origin100.iteye.com/blog/267165 /** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络 ...
- java byte(字节_Java字节序,java整型数与网络字节序 byte[] 数组转换关系(ByteArrayOutpu......
/** * 通信格式转换 * * Java和一些windows编程语言如c.c++.delphi所写的网络程序进行通讯时,需要进行相应的转换 * 高.低字节之间的转换 * windows的字节序为低字 ...
- java转网络字节序_【转】网络字节序与主机字节序
最近在项目开发过程中,需要在采用JAVA作为语言的服务器与采用C++作为语言的服务器间进行通信,这就涉及到这两种语言间数据类型的转换以及网络字节序与主机字节序的区别.该文主要说说网络字节序和主机字节序 ...
最新文章
- (转译)用FFmpeg和SDL写播放器--01视频帧提取
- MyBatis:参数传递 [转]
- 在python中可以用什么关键字来声明一个类_3. Python基础语法
- array关于map,reduce,filter的用法
- scp命令:服务器间远程复制代码
- mysql mmm vip_MySQL MMM架构看不到vip地址
- linux系统测网速工具
- 关于keystore 文件生成PK8+PEM文件
- python分析财务报表
- H3C nqa 配置
- keil5安装之后的L6002U问题
- SpringBoot 单元测试——JUnit5
- Word2010撤销按钮失效,Ctrl+Z失效解决办法
- 暴跌是因币安丢币后做空?让链上数据告诉你真相
- WUST 五一萌新向CTF writup
- android弹出输入法内存,android 输入法导致内存泄露问题
- Dynamodb 备份策略
- ElementUI 获取el-table表格选中行信息及清除选中行
- android蓝牙连接回调没反应,Android蓝牙套接字连接无法正常工作
- tomcat配置SSL报错解决:java.lang.IllegalArgumentException: Invalid character (CR or LF) found in method nam
热门文章
- python打开文件并读取内容-Python实现的读取文件内容并写入其他文件操作示例
- python程序实例电话本-利用Python电话本小程序!这波操作你给几分?
- python上海培训哪里比较好-python培训机构上海哪里好?
- python第三方库有哪些常用的、请列举15个-阿里巴巴Python开发工程师面试题
- python适合零基础学习吗-Python适合不适合零基础学习呢?老男孩教育
- 不想学python-没想到,学会Python即使不做程序员都能月入过万!
- 为什么电脑下载python很慢-Python运行速度慢你知道这是为什么吗?
- python读取excel某一行内容-python3读取excel文件只提取某些行某些列的值方法
- python在日常工作处理中的应用-谈谈Python在工作中的应用
- open source license主流的开源软件协议介绍