网站首页 > 基础教程 正文
前言
本文主要介绍的是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++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的视频教程
通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势
猜你喜欢
- 2024-12-30 C++ 在编程语言谱系中的位置及其特点
- 2024-12-30 C++基础知识总结(超详细总结) c++ 基础
- 2024-12-30 [面试]C++中struct和class的区别是什么
- 2024-12-30 C++类和C语言的结构体有什么区别?linux C++第18讲
- 2024-12-30 C与C++利用pragma pack对结构体做成员打包对齐设置
- 2024-12-30 结构体所占内存大小 结构体所占内存大小是所有成员所占的内存字节数计算
- 2024-12-30 结构体的各种使用方法详细讲解-c\c++
- 2024-12-30 C++,结构体和类,结构体和类的区别,struct与class的区别
- 2024-12-30 C++编程:复合数据类型—结构体 c语言结构体复数运算
- 2024-12-30 C#与C++交互开发系列之复杂类型传递与解析
- 01-07Python从入门到放弃-详解列表、元组和字典
- 01-07python 中字典如何进行复制
- 01-07python入门023:字典嵌套
- 01-07掌握Python字典的12个例子
- 01-07使用Python 获取多级字典(Json)格式所有Key、Value
- 01-07简单学Python——字典的操作1(增加、更改和删除字典元素)
- 01-07Python之容器拾遗:Python就是包裹在一堆语法糖中的字典
- 01-07深入了解python字典的有序特性
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)