环境: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语言字节序对齐以及空间利用率相关推荐

  1. c语言中的字节序和字节对齐,C语言字节序对齐以及空间利用率

    环境:ubuntu 64bit gcc vim #include #include #include #include #include #include #include typedef struc ...

  2. 格物致知 c语言字节数、对齐、补齐的小探索

    写在前面 工作几年了,由于信奉陶渊明的 "好读书,不求甚解" (其实是懒) 的思想,很多概念其实了解的很模糊,最近工作中遇到一个问题:"64位环境下,指针占多少个字节?& ...

  3. 程序人生 | C语言字节对齐问题详解 - 对齐/字节序/位序/网络序等(上)

    本文首发于 2014-07-21 15:32:28 1. 引言 考虑下面的结构体定义: typedef struct{char c1;short s; char c2; int i; }T_FOO; ...

  4. C语言字节对齐问题详解

    转载原文连接:https://www.cnblogs.com/clover-toeic/p/3853132.html C语言字节对齐问题详解 引言 考虑下面的结构体定义: 1 typedef stru ...

  5. C语言字节对齐问题详解(zz)

    http://www.bubuko.com/infodetail-263205.html 引言 考虑下面的结构体定义: typedef struct{char c1;short s; char c2; ...

  6. c语言特殊字符字符串宽度对齐,[转]C语言字节对齐问题详解

    引言 考虑下面的结构体定义: 1 typedef struct{2 charc1;3 shorts;4 charc2;5 inti;6 }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1 ...

  7. c如何通过偏移量取出文件中的字节_理一理C语言字节对齐的那些事

    作者:守望,Linux应用开发者,目前在公众号[编程珠玑] 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源. 前言 字节对齐是我们初学C语言就会接触到的一个概念,但是到底什么 ...

  8. C语言学习笔记——堆区空间申请(一)

    C语言学习笔记 堆区空间申请(一) 栈区变量分析 所有程序/软件的运行,都是由操作系统统一调配的,操作系统是程序的运行环境 运行中的多个程序之间,内存是不交叉的 程序结束后,操作系统还要释放其使用的资 ...

  9. C语言 字节对齐问题 详解

    一  什么是字节对齐 现代计算机中,内存空间按照字节划分,理论上可以从任何起始地址访问任意类型的变量.但实际中在访问特定类型变量时经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排 ...

最新文章

  1. 图像的多分辨率金字塔详解
  2. thuderbird接收qq邮箱设置
  3. efcore 实体配置_创建并配置模型
  4. Tensorflow 2.1 迁移学习 基于VGG
  5. 反卷积(Deconvolution)、上采样(UNSampling)与上池化(UnPooling)加入自己的思考(tensorflow函数)(一)
  6. MyBatis学习(十)--MyBatis数据操作
  7. Solaris 11.4安装,映像包管理系统(IPS)搭建
  8. SpringBoot 实现AOP的简单测试demo
  9. 蓝桥杯:调和级数————Python
  10. ABAP数据字典和数据表的读取
  11. 基于K近邻的葡萄酒质量检测项目
  12. go环境搭建开发工具安装配置
  13. SQL SERVER 连乘写法
  14. 推荐一款免费的cdn加速网站
  15. 洛谷P1367 蚂蚁
  16. [数据结构][Python][经典题目]明星问题
  17. #单调队列#洛谷 2698 [USACO12MAR]花盆Flowerpot
  18. Java/26. Remove Duplicates from Storted Array 删除排序数组的重复项
  19. 考研英语 常见介词词组
  20. Qt中Enter键实现跳转按键功能

热门文章

  1. css3 画太极图——用三个div实现
  2. JavaWeb航空购票系统的设计与实现
  3. django框架运用--------股票系统
  4. 数据库的隔离级别有哪些?
  5. 气质的培养(哈佛管理世界
  6. echarts报错分析汇总
  7. Ubuntu ifconfig命令eth0没有IP 解决方法
  8. java小白的学习笔记 JDBC控制事物的转账案例
  9. vue使用element中的el-date-picker实现每月的第几周
  10. VR实景看房,解锁购房新姿势