网站推广app下载,dede网站名称不能保存,网站如何做网站名称,wordpress 摄影 模板每日激励#xff1a;“不设限和自我肯定的心态#xff1a;I can do all things。 — Stephen Curry” 绪论#xff1a; 通过本章你能具体的了解到#xff0c;如何计算出一个类的大小#xff0c;并且了解其中到底是如何算的以及了解到为什么需要内存对齐这种算#xff0… 每日激励“不设限和自我肯定的心态I can do all things。 — Stephen Curry” 绪论 通过本章你能具体的了解到如何计算出一个类的大小并且了解其中到底是如何算的以及了解到为什么需要内存对齐这种算 ———————— 早关注不迷路话不多说安全带系好发车啦建议电脑观看。 类对象的大小 类对象的大小来说仅由成员影响成员函数不影响因为在C中成员函数实际上是在编译时被解析并绑定到特定的对象上通过对象来调用这些方法并不会增加对象本身的存储需求。具体来说在创建一个类的实例时只有成员变量会被分配内存空间而成员函数则存在于程序的代码段中。即使增加了更多的内联或非内联成员函数也不会改变单个类实例所占用的内存大小。 —— 但注意的是当要计算一个类的大小的时候并不是直接通过查看类中成员的类型和个数最终算出的所占字节决定的决定的 ——而是成员在不同类型和个数影响大小的基础上引入了内存对齐 那内存对齐到底是什么让我们接着往下看 首先理解为什么要内存对齐
不是所有的硬件平台都能访问任意地址上的任意数据的某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。如取int的4byte性能原因因为假如在没有内存对齐的情况下当一个类中刚好有两个成员char 、int 此时不进行内存对齐那么 char的1byte和int的4byte将会连在一起假设要取其中的int那么读取过程中从前往后的找int每次读取4byte但因为是char和int连着存放其中会有3byte和char连在一起读取了前4byte因为存在一些int但其中第1byte并不是int的也代表还没读取完所以还得继续读取还剩的1byte那么就需要再一次进行读取才能将int读完也就代表需要读取两次才能将一个int读取完但假如使用了内存对齐将int对齐到倍数位置就能很方便的不需要过滤char的直接一次性读完 总体来说结构体的内存对齐是拿空间来换取时间的做法 话不多说那么我们就快速的来看内存对齐的规则到底是什么这么算出类对象大小 对齐规则
首先我们理解对于变量他们都是放到栈区的而栈区其实可以把他想象成一个竖起来的数组
第一个参数直接放入对齐到偏移量为0的位置从第二个成员变量开始要对齐到偏移量为自身对齐数的整数倍处 自身对齐数 判断自身大小 和 系统默认对齐数 进行比较取较小值为对齐数有点抽象先看着后面有例子 结构体的总大小最终要为所有成员变量中的取过的最大对齐数的整数倍如果有镶嵌结构体 那这个最大对齐数的判断也要包括所镶嵌的结构体 内的 成员的对齐数并且这个镶嵌结构体也要对齐到自身的最大的对齐数上在外部的结构体内 附在Linux gcc 环境下没有默认对齐数 对齐数就是其本身大小、计算偏移量的宏offsetof类名成员名
例子结构如下
struct/class S1
{char c1;int i;char c2;
};分析
首先将 c11byte 直接放到 0 偏移量处并占1byte从第二个开始就要把成员放到 自身对齐数的整数倍处 也就是 i int放到自身对齐数整数倍处自身对齐数 4 取 自身大小4 和 默认对齐数8 的较小值那么从 就要放到 3 偏移处从0开始0 ~ 3 4并占4byte此时总大小就是 0 ~ 3 4 8在放一个 c2 对齐数为 11 8此时总大小就占了9byte了 最终的大小等于在成员中自身对齐数最大的数4的整数倍 1 4 1所以还得让总大小值是4它的倍数9 - 12大小 栈的存储过程图
struct name
{int a;char b;int c;int d;
};4 1 3偏移 4 4 16
扩充考虑多态情况下的虚表指针 不仅要考虑内存对齐在多态情形中我们还需要考虑虚表地址它存储着类中所有的虚函数地址 当一个类有虚函数时在这个类中不仅仅需要考虑类成员的内存对齐以及 还要加上一个虚表地址大小4byte/8byte32位/64位地址总线的宽度 本章完。预知后事如何暂听下回分解。
如果有任何问题欢迎讨论哈
如果觉得这篇文章对你有所帮助的话点点赞吧
持续更新大量C细致内容早关注不迷路。