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

[C++]内存对齐

[C++]内存对齐

不同类型的内存大小

数据类型 32位大小 64位大小
char 1 1
short 2 2
int 4 4
long 4 8
long long 8 8
指针 4 8
float 4 4
double 8 8

对齐规则

编译器有一个#pragma pack(n)表示默认对齐单位,实际进行结构体对齐时,会取n和成员中最长的数据类型的长度作为对齐单位,具体规则如下:

  1. 第一个成员变量的偏移量为 0。
  2. 其他成员变量的地址必须是其大小和对齐单位中较小值的整数倍。
  3. 结构体总大小必须是最大对齐单位的整数倍。
  4. 如果结构体中嵌套了其他结构体,嵌套结构体的起始地址也需要满足其最大对齐单位的整数倍。

例子

#pragma pack(4)  // 默认对齐值struct A
{char x; // 占用地址0int y; // 偏移量必须是4的整数倍,因此占用地址4567char z; // 占用地址8,为了满足结构体大小为4的整数倍,地址9、10、11也算作A的内存
}; // 大小为12
struct B
{char x;  // 0int *p;  // 64位下大小为8,因此起始地址为8int y;   // 16
}; // 大小为24
struct C
{int x;  // 0B b;  // 这里看B的最大对齐值,为8,所以起始地址为8,占用24字节char c;  // 32
}; // 大小应该为8的整数倍,所以是40

类的内存对齐

class B
{
protected:char x;  // 0int *p;  // 64位下大小为8,因此起始地址为8int y;   // 16
public:B() : x('0'), p(nullptr), y(0) {}void Foo(){return;}
}; // 这个类没有虚函数,对齐方式与结构体相同,大小为24
class B
{
protected:char x;  // 0int *p;  // 64位下大小为8,因此起始地址为8int y;   // 16
public:B() : x('0'), p(nullptr), y(0) {}void Foo(){return;}virtual void Bar() = 0; // 加上虚函数后,起始地址存的是虚函数表
}; // 大小为32class C
{
protected:char x; // 起始地址为8
public:virtual void Bar(){// do nothingreturn;}
};
// 相当于struct C {void ** vtable; char x;};
// 对齐单位是8,所以大小为16
http://www.jsqmd.com/news/703994/

相关文章:

  • ARM ETM-A5嵌入式追踪技术详解与调试实践
  • 想要精准止损?堵住精益工厂利润流失的落地方法与避坑指南
  • C#与三菱PLC以太网通讯程序上位机源码:基于3E帧SLMP/MC协议与FX5U/Q系列PLC...
  • FPGA课程设计避坑指南:单周期CPU模型机下板测试,解决rst复位信号导致LED不亮的问题
  • PyTorch逻辑回归实现与交叉熵损失函数详解
  • Bedrock Launcher:为Windows玩家打造的终极Minecraft启动器解决方案
  • 2026年4月萧邦官方售后网点核验报告(含迁址/新开):老司机亲测・血泪教训・避坑指南 - 亨得利官方服务中心
  • 3个步骤彻底告别macOS应用残留文件,Pearcleaner如何让Mac重获新生
  • 配电网重构解析:孤岛划分方法与故障处理策略研究
  • ojの报错总结
  • ruyiPage 框架解读/刨析
  • HyperFrames:用代码生成视频
  • Snap.Hutao原神工具箱:解决玩家痛点的专业桌面助手
  • LSTM中TimeDistributed层的原理与应用实践
  • 多智能体辩论能提高正确率吗:实验方法与结论解读
  • 如何快速掌握FloPy:新手必知的5个高效建模技巧
  • RimWorld模组管理器终极指南:3步告别模组冲突,轻松管理200+模组
  • ComfyUI-SUPIR 内存访问冲突深度解析:3221225477系统崩溃问题的多维度解决方案
  • 如何快速掌握CREST分子构象搜索:新手完全指南与实战技巧
  • 百年医德一心为齿 —— 义乌王萍口腔品牌合规实力全解析 - 速递信息
  • 保姆级教程:在Qt5嵌入式Linux设备上实现流畅的触摸屏地图浏览(双指缩放+单指拖动)
  • 小林计算机网络|模型篇 + 应用篇 全图解
  • 忍者像素绘卷微信小程序落地:教育机构‘忍者编程课’像素教具生成工具
  • 手把手教你用eNSP模拟华为交换机,配合snmp_exporter搭建监控测试环境(保姆级避坑)
  • OpenContracts:构建结构化知识库,实现人类与AI智能体的协同工作
  • 赋予AI“北极星”:如何让智能体自主设定并追踪目标
  • 2026 年全球范围主流且较难绕过的反 bot / 反爬防护
  • 硅光子储层计算:突破AI硬件加速新范式
  • 如何快速为Unity游戏添加自动翻译:XUnity.AutoTranslator完整指南
  • Unity PSD导入引擎深度解析:高性能图像解析架构与工作流优化方案