结构体的大小以及内存对齐问题

本文详细解释了结构体内存对齐的概念,说明它是如何通过优化内存访问减少时间浪费的。讲解了结构体内存对齐的规则,包括对齐数、成员变量对齐和结构体总大小的计算方法,并通过实例演示了如何计算结构体的大小。

结构体的大小怎么计算?什么是结构体的对齐? 

首先想要直到结构体的大小需要先了解结构体的内存对齐。那么,什么是结构体的内存对齐:

什么是结构体内存对齐

结构体的对齐 就是 结构体类型数据在内存中按照一定的对齐规律储存。结构体的对齐归根结底其实就是用空间换取时间的做法。至于为什么可以用空间换取时间呢?请看这么一张图:

假如一个结构体的数据像图中这样摆放。如果一个cpu读取数据, 是按照8个字节8个字节的规律进行读取。 那么他从a的首地址开始读取,第一次读取可以将int读完, 但是此时只读取了一半的double 类型的b, 想要完全读取b还要再多读取一次,这就造成了时间的浪费。

但是, 如果按照结构体对其规律进行数据存储呢? 

这样,我们读取一次读到一个完整的a, 在读取一次读到完整的b。

另外, 并不是所有的硬件都能随意的访问任意地址处的数据。这些硬件可能只能读取特定的地址处的数据。

结构体内存对齐的规律

结构体内存对齐需要遵循对齐数的规律, 即:结构体的第一个成员对齐到结构体首地址处, 其他成员对齐到对齐数整数倍的偏移量处。

把握住两个点:成员变量的对齐数、结构体的总大小

成员变量的对齐数:该对齐数为成员变量的大小和编译器默认大小的较小值。

结构体的总大小:每个成员变量的对齐数之中最大的那个对齐数的整数倍。

计算结构体的大小的时候, 只要严格遵守这对齐数的使用规则:

1、计算成员变量的偏移量时, 先确定该成员变量的对齐数,偏移量为对齐数的整数倍。

2、计算结构体变量时, 将所有成员变量的对齐数逐个比较一下。取出最大的对齐数,然后结构体的大小就是最大的对其数的整数倍。

下面来看一下练习:

 假如创建一个该结构体变量a , 那么a的内存存储是这样的:

我们来验证一下是否正确 

综上就是结构体大小的计算方法。 

内容概要:本文是一份针对2025年中国企业品牌传播环境撰写的《全网媒体发稿白皮书》,聚焦企业媒体发稿的策略制定、渠道选择与效果评估难题。通过分析当前企业面临的资源分散、内容同质、效果难量化等核心痛点,系统性地介绍了新闻媒体、央媒、地方官媒和自媒体四大渠道的特点与适用场景,并深度融合“传声港”AI驱动的新媒体平台能力,提出“策略+工具+落地”的一体化解决方案。白皮书详细阐述了传声港在资源整合、AI智能匹配、舆情监测、合规审核及全链路效果追踪方面的技术优势,构建了涵盖曝光、互动、转化与品牌影响力的多维评估体系,并通过快消、科技、零售等行业的实战案例验证其有效性。最后,提出了按企业发展阶段和营销节点定制的媒体组合策略,强调本土化传播与政府关系协同的重要性,助力企业实现品牌声量与实际转化的双重增长。; 适合人群:企业市场部负责人、品牌方管理者、公关传播从业者及从事数字营销的相关人员,尤其适用于初创期至成熟期不同发展阶段的企业决策者。; 使用场景及目标:①帮助企业科学制定媒体发稿策略,优化预算分配;②解决渠道对接繁琐、投放不精准、效果不可衡量等问题;③指导企业在重大营销节点(如春节、双11)开展高效传播;④提升品牌权威性、区域渗透力与危机应对能力; 阅读建议:建议结合自身企业所处阶段和发展目标,参考文中提供的“传声港服务组合”与“预算分配建议”进行策略匹配,同时重视AI工具在投放、监测与优化中的实际应用,定期复盘数据以实现持续迭代。
先展示下效果 https://pan.quark.cn/s/987bb7a43dd9 VeighNa - By Traders, For Traders, AI-Powered. Want to read this in english ? Go here VeighNa是一套基于Python的开源量化交易系统开发框架,在开源社区持续不断的贡献下一步步成长为多功能量化交易平台,自发布以来已经积累了众多来自金融机构或相关领域的用户,包括私募基金、证券公司、期货公司等。 在使用VeighNa进行二次开发(策略、模块等)的过程中有任何疑问,请查看VeighNa项目文档,如果无法解决请前往官方社区论坛的【提问求助】板块寻求帮助,也欢迎在【经验分享】板块分享你的使用心得! 想要获取更多关于VeighNa的资讯信息? 请扫描下方二维码添加小助手加入【VeighNa社区交流微信群】: AI-Powered VeighNa发布十周年之际正式推出4.0版本,重磅新增面向AI量化策略的vnpy.alpha模块,为专业量化交易员提供一站式多因子机器学习(ML)策略开发、投研和实盘交易解决方案: :bar_chart: dataset:因子特征工程 * 专为ML算法训练优化设计,支持高效批量特征计算与处理 * 内置丰富的因子特征表达式计算引擎,实现快速一键生成训练数据 * Alpha 158:源于微软Qlib项目的股票市场特征集合,涵盖K线形态、价格趋势、时序波动等多维度量化因子 :bulb: model:预测模型训练 * 提供标准化的ML模型开发模板,大幅简化模型构建与训练流程 * 统一API接口设计,支持无缝切换不同算法进行性能对比测试 * 集成多种主流机器学习算法: * Lass...
### 结构体大小计算规则与内存对齐原理 #### 一、基本概念 在C/C++中,结构体大小并不总是等于其成员变量大小之和。这是因为编译器为了提高访问效率,会对数据存储进行**内存对齐**处理。这种对齐方式会影响结构体的实际大小。 #### 二、内存对齐规则 1. **成员变量的对齐**: 每个成员变量都会按照自身的类型大小或者指定的对齐数(取两者较小值)来决定其起始地址。具体来说,对于某个成员变量`X`,它的起始地址必须是对齐数的整数倍[^2]。 2. **结构体整体对齐**: 整个结构体大小必须是该结构体内最大成员变量类型的大小或默认对齐数(通常是8,在某些平台上可能是其他值)的最小公倍数。这意味着如果结构体内部所有成员占用的空间加起来不是对齐数的整数倍,则会在末尾填充额外空间以满足这一条件[^3]。 3. **默认对齐数的影响**: 默认情况下,大多数平台上的VS编译器采用的是8字节对齐策略;而GCC则可能依据目标架构有所不同。可以通过设置预处理器指令改变此行为,比如使用 `#pragma pack(n)` 来强制设定新的对齐边界为n字节[^4]。 #### 三、实例分析 考虑如下定义的一个简单结构体: ```c++ struct S { char a; int b; }; ``` - 成员`a`是一个字符型(char),它只需要一字节即可存放,因此可以直接位于偏移量0的位置上; - 接下来的整型(int)b需要四个连续字节才能保存下来,并且由于存在四字节对齐的要求(因为int通常有4字节宽度),即使前面只用了单字节空间也要跳过三个空闲位再放置b; - 最终考虑到整个对象也需要保持一定的对齐特性——这里假设系统规定至少按四字节单位排列——所以在最后还应该补足至最接近下一个可被四除尽之处为止。 综上所述,上述例子中的`s.size()`应该是八而不是五[^1]。 #### 四、特殊情况讨论 当涉及到联合体(unions)时,情况又有所区别。在一个union里头不管有多少种不同类型的数据项共用同一片物理区域,故而union本身的尺寸仅取决于其中最大的那个成分而已[^2]。 另外值得注意的一点是在跨平台开发过程中可能会遇到不同操作系统间关于这些细节实现差异带来的兼容性挑战。 --- ### 示例代码展示 下面给出一段用于验证前述理论的小程序片段: ```cpp #include <iostream> using namespace std; #pragma pack(push, 1)//临时修改当前文件内的打包选项为一字节对齐 struct TestStruct{ unsigned char ch;//占一位 short sht; //占两位 long lng; //一般占四位 }; int main(){ cout << "Size of Struct with packing=1: "<<sizeof(TestStruct)<<endl; #pragma pack(pop)//恢复原始状态 cout<<"Normal Size:"<<sizeof(TestStruct); } ``` 运行这段脚本可以看到开启紧密压缩模式前后测试结构体型态的变化效果明显不一样. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值