当前位置: 首页 > news >正文

23、字节对齐

struct AlignedStruct {char a;   // 本来1字节,padding 3 字节int b;    //  4 字节short c;  // 本来 short 2字节,但是整体需要按照 4 字节对齐(成员对齐边界最大的是int 4) // 所以需要padding 2// 总共: 4 + 4 + 4
};struct MyStruct {double a;    // 8 个字节char b;      // 本来占一个字节,但是接下来的 int 需要起始地址为4的倍数//所以这里也会加3字节的paddingint c;       // 4 个字节// 总共:  8 + 4 + 4 = 16
};

分析 struct MyStruct 的对齐情况。

  1. double a 占用 8 个字节,起始地址为 0。
  2. char b 占用 1 个字节,起始地址为 8。
  3. 为了使 int c 对齐到 4 字节边界,需要在 char b 后面填充 3 个字节的 padding,因此 int c 的起始地址为 12。
  4. int c 占用 4 个字节,起始地址为 12。

因此,struct MyStruct 的总大小为 16 个字节。

为了进一步验证,我们可以编写一个简单的 C++ 程序来检查结构体的大小:

#include <iostream>struct MyStruct {double a;char b;int c;
};int main() {std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl;return 0;
}

运行这个程序,会发现 MyStruct 的大小确实是 16 个字节。

总结:struct MyStruct 的对齐之后的大小是 16 个字节,而不是 24 个字节。


AlignedStruct 为什么是 12 呢 ?
详细分析 struct AlignedStruct 的对齐情况:

  1. char a 占用 1 个字节,起始地址为 0。
  2. 为了使 int b 对齐到 4 字节边界,需要在 char a 后面填充 3 个字节的 padding,因此 int b 的起始地址为 4。
  3. int b 占用 4 个字节,起始地址为 4。
  4. short c 占用 2 个字节,起始地址为 8。
  5. 为了使整个结构体的大小是 int 的倍数(最大对齐边界),需要在 short c 后面填充 2 个字节的 padding。

因此,struct AlignedStruct 的总大小为 12 个字节。

为了进一步验证,我们可以编写一个简单的 C++ 程序来检查结构体的大小:

#include <iostream>struct AlignedStruct {char a;int b;short c;
};int main() {std::cout << "Size of AlignedStruct: " << sizeof(AlignedStruct) << " bytes" << std::endl;return 0;
}

运行这个程序,会发现 AlignedStruct 的大小确实是 12 个字节。

总结:struct AlignedStruct 的对齐之后的大小是 12 个字节。

http://www.xdnf.cn/news/929251.html

相关文章:

  • 22、模板特例化
  • WPF 播放器(AudioPlayer 2025)
  • triton学习笔记6: Fused Attention
  • CAN转PROFINET网关设备基本功能介绍
  • Android资源ID冲突解决方案
  • 28、元组的遍历
  • Redis :String类型
  • 第23讲、Odoo18 邮件系统整体架构
  • AIGC行业发展演进:从技术萌芽到智能革命
  • 全面解析:tzst 归档格式的先进性与跨平台文件管理指南
  • RTOS学习之重难点
  • go语言学习 第8章:切片
  • CMake检测C编译器标志功能
  • 基于51单片机的24小时倒计时仿真
  • CAN转PROFINET协议网关之PROFINET转CANfree组态秘诀
  • 10.接雨水
  • 九、【ESP32开发全栈指南: UDP通信服务端】
  • Redis 持久化机制深度解析
  • 反向传播的核心是什么:计算损失函数对可训练参数的梯度=== 损失函数能通过计算图连接到可训练参数
  • 打印高质量日志的10条军规
  • FPGA 可重构技术的实现方法
  • 技术有边界,责任无止境——AI伦理治理的未来挑战与全球路径
  • Welearn 課程時長半小時速刷200小時油猴腳本
  • 类与对象(1)
  • 物联网技术发展与应用研究分析
  • 技巧小结:根据寄存器手册写常用外设的驱动程序
  • 6.7-leetcodeT3170
  • 低成本嵌入式Linux开发方案:RV1106入门
  • 代码注释类型
  • 【win | 自动更新关闭】win11