当前位置:网站首页>结构体大小计算--结构体内存对齐
结构体大小计算--结构体内存对齐
2022-08-02 06:20:00 【风吹电风扇】
1.对齐规则
结构体的内存大小是根据其内存对齐的结果计算得来的,对齐遵循以下规则:
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到对齐数的整数倍的地址处。
(对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。)
3 .结构体的总大小位最大对齐数的整数倍。
2.计算演示
代码
struct A
{
char ch;
short num1;
int num2;
};
struct B
{
char ch;
int num2;
short num1;
};
int main()
{
printf("%u %u", sizeof(struct A), sizeof(struct B));
}
结果
可是结构体A和结构体B的内容是完全一样的,为什么计算出的大小不同?
过程分析
注:VS中的默认对齐数为8
结构体A
1. 将char类型数据排在偏移量为0的位置,char的大小为1,对齐数取8(VS中的默认对齐数)和1的较小值为12.将short类型放到2的整数倍位置(2和8的较小值)
3.再将int类型放到4(4和 8的最小值)的整数倍位置。

同理结构体B占12字节,如下图所示:

3.修改默认对齐数
#pragma pack()
例子
#pragma pack(8)//设置默认对齐数为8
#pragma pack(1)//设置默认对齐数为1
#pragma pack()取消设置的默认对齐数,还原为默认
用处:让程序员能够更好的设计结构体就以上面同样内容的结构体A和B为例,优秀的结构体设计可以节省不少内存。
注:修改完默认对齐数后别忘了改回去!
边栏推荐
- Toolbox App 1.25 New Features at a Glance | Version Update
- 能与观众实时互动的Claper
- MySQL Advanced Statements (1)
- [Dataset][VOC] Eyewear dataset 6000 in VOC format
- MySQL - Multi-table query and case detailed explanation
- Xgboost报错ValueError:无效的形状:标签(1650 2)
- FaceBook社媒营销高效转化技巧分享
- 实例026:递归求阶乘
- abaqus如何快速导入其他cae文件的assembly?
- CAT1 4G+以太网开发板腾讯云手机微信小程序显示温度和下发控制
猜你喜欢
随机推荐
武汉高性能计算大会2022举办,高性能计算生态发展再添新动力
Summer Summary (3)
【21天学习挑战赛】顺序查找
rhce homework
How does abaqus quickly import the assembly of other cae files?
提交代码流程
张驰课堂:六西格玛培训工具——箱线图
Unity Shader学习(七)纹理图像的简单使用
At age 94, pioneer Turing award winner, computational complexity theory, Juris Hartmanis, died
两篇不错的php debug教程
love
Nodejs installation and global configuration (super detailed)
request.getSession(), the story
项目开发规范
实例032:反向输出II
[npm install error report collection] - npm ERR! code ENOTEMPTY npm ERR! syscall rmdir
有点奇怪!访问目的网址,主机能容器却不行
HCIP 第三天实验
享年94岁,图灵奖得主、计算复杂性理论先驱Juris Hartmanis逝世
解决Pytorch模型在Gunicorn部署无法运行或者超时问题





![[数据集][VOC]眼睛佩戴数据集VOC格式6000张](/img/66/37f76d9ce5d5f68d6ea0e18710fa04.png)



