前言

本文主要介绍的是C/C++中 结构体的所占用内存问题做以分析,希望对于广大读者有一些帮助。在编写C语言一下程序的时候:

struct data{int iNum;float fNum;long lNum;};

结构体里会包括int char double,它们要占用的空间不同,系统为一个结构体开辟内存空间时,会有2种选择。

  • 第一种:节省空间的方案,以上面的例子来说的话,就是4(int) + 1(char) + 8(double) =13个字节;
  • 第二种:浪费空间的方案,以上面的例子来说的话,就是4(int) + 4(char) + 8(double) =16个字节;

其实,系统使用的第二种方案,通过sizeof统计检验测试结果如下图:

为什么存在字节对齐?

为了CPU只寻找地址一次,就能够把目标内存中的数据取出来。计算机中内存空间都是按照byte划分的 ,如果是用第一种节省空间的方案,为了要取一个int或者double的成员的值,CPU寻址一次,可能只取出来一部分,所以需要再次寻址,这样就导致CPU的效率降低。为了提高CPU的效率,所以选择牺牲空间,但是节省了时间。

ps: 大家在声明结构体成员的时候,一定把占用空间最小的类型放在最前面,占用空间最大的放在最后面,这样就会节省内存空间。尤其是在做网络数据传输的时候,这样更能体现其效率性。这样避免因为对齐问题而导致的无用内存的传输。

对齐案例分析

No.1 最长字节中间位置分析

No.2 按照大小顺序写法

No.3 函数组的内存分析

ps:不管数组里多少个元素,只看数组的类型,以下面最长字节去对齐即可

特殊情况

NO.1 强制对齐: #pragma pack(4)

和上面比较,如果注释掉 #pragma pack(4),是按照8个字节去对齐,字节占用是24个字节

NO.2 位段

ps:位段中如果存在int类型的本质也是以4个字节去对齐的,注意哦!

好了今天的知识到这里就结束了!如果有学到知识的同学们,可以留言学到了哦!如果可以的话也是可以一键三连,关注加转发和点赞。

尾言

文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程

《C语言51课视频教程合集》

《C++45课视频教程》

通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势

new 一个结构体数组_C语言结构体到底占多少内存?简单!一文助你解决结构体内存问题...相关推荐

  1. c定义一个整型数组_C语言学习|数组

    一.数组的定义 数组:由若干类型相同的相关数据项按顺序存储在一起形成的一组同类型有序数组的集合 元素:用一个统一的名字标识这组数据,这个名字称为数据名,构成数据的每一个数据项 下标:从0开始的整数,遵 ...

  2. 第十章 结构体_C语言共用体(C语言union用法)详解

    通过前面的讲解,我们知道结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员.在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(Union),它的定义格式为:  un ...

  3. c语言数组如何把一串数字存入数组_C语言经典编程题(下)

    C语言字符串加密和解密算法C语言输出等腰三角形C语言约瑟夫环问题C语言整数逆序输出C语言三色旗问题C语言求定积分C语言求空间两点之间的距离C语言日期处理函数C语言汉诺塔问题C语言九九乘法表C语言杨辉三 ...

  4. 一维数组c语言,c语言一维数组_C语言一维数组入门教程

    摘要 腾兴网为您分享:C语言一维数组入门教程,优衣库,小米手环,小米钱包,小度等软件知识,以及胎教宝典,一级建造师题库软件,康佳渠道,刷点卷,一加系统,音乐节拍器,liveuc视频会议,辽宁省政务服务 ...

  5. c 字符串数组_C语言探索之旅 | 第二部分第四课:字符串

    内容简介 前言 字符类型 显示字符 字符串其实就是字符的数组 字符串的创建和初始化 从 scanf 函数取得一个字符串 操纵字符串的一些常用函数 总结 第二部分第五课预告 1. 前言 上一课 C语言探 ...

  6. 第六章 C语言数组_C语言数组的越界和溢出

    数组越界 C语言数组是静态的,不能自动扩容,当下标小于零或大于等于数组长度时,就发生了越界(Out Of Bounds),访问到数组以外的内存.如果下标小于零,就会发生下限越界(Off Normal ...

  7. 第六章 C语言数组_C语言数组是静态的,不能插入或删除元素

    在C语言中,数组一旦被定义后,占用的内存空间就是固定的,容量就是不可改变的,既不能在任何位置插入元素,也不能在任何位置删除元素,只能读取和修改元素,我们将这样的数组称为静态数组. 反过来说,如果数组在 ...

  8. c语言函数返回数组_C语言如何用一维数组拷贝函数,拷贝二位数组(C Primer Plus 10-7)...

    程序内容: 初始化一个double类型的二维数组,使用编程练习2中的一个拷贝函数把该数组中的数据拷贝至另一个二维数组. 程序为C Primer Plus第十章第七题的答案示例 附:程序代码为本人亲自编 ...

  9. python 结构体指针_C语言结构体指针(指向结构体的指针)详解

    当一个指针变量指向结构体时,我们就称它为C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: //结构体 struct stu{ char *nam ...

最新文章

  1. 利用OpenCV的Grabcut()函数实现图像的前景与背景的分割-并对Grabcut()作详细介绍
  2. 直击于丹软肋的作家——李悦
  3. PHP-面向对象编程教程
  4. 12c oracle 修改内存_关于Oracle数据库12c 新特性总结
  5. java query object_java queryforobject
  6. 山东民办计算机专业排名2015,2021年山东最好的民办大学排名
  7. 博客园自定义样式(标题 h1 h2 h3)
  8. IOS开发--网络篇--GET请求和POST请求
  9. mysql查询优化~group by知多少
  10. linux-网卡名字说明_基本网络配置_修改MTU值
  11. 40+个工业检测数据集
  12. 解决由于找不到amd_ags_x64.dll,无法继续执行代码。重新安装程序可能会解决此问题,地平线(Forza Horizon 5)
  13. 8、哈希表(Hash)
  14. 认识涤生大数据的几个月,彻底改变了我
  15. No module named _lzma
  16. backup exec oracle agent无法验证数据库凭证,通过Backup Exec实施Oracle灾难恢复数据库 -电脑资料...
  17. chrome插件(Resolution Test)不同分辨率测试
  18. 给在北漂准备租房的菜鸟一点建议
  19. 实现很简单的搜索引擎
  20. 图像上的算术运算 | 十一

热门文章

  1. Codeforces Beta Round #97 (Div. 1) C. Zero-One 数学
  2. Ubuntu Linux环境下的Android开发环境的配置
  3. SilverLight学习笔记--关于Silverlight资源文件(如:图片)的放置位置及其引用
  4. ASP.NET 状态视图概览
  5. jenkins构建后接受者收不到邮件问题解决方案
  6. linux跑程序占用缓存过多释放内存echo 3 > /proc/sys/vm/drop_caches
  7. 计算机视觉目标检测算法总结1——简介
  8. PTA5-53 两个有序序列的中位数
  9. 在Linux下安装bind服务,在Linux系统下安装DNS服务器BIND
  10. word 编辑域中的汉字_Word中根号2、根号3怎么打?