C++内存对齐

本文介绍了C++中的内存对齐方式,包括默认对齐和预编译指定对齐,并详细解析了对齐规则。通过实例展示了不同对齐规则下结构体的内存布局,深入理解内存对齐对程序性能的影响。
摘要由CSDN通过智能技术生成

0x0. 内存对齐方式

  1. 默认方式
    gcc编译器默认采用结构体/类中最大类型长度对齐方式。
  2. 预编译指令指定方式
    语法:#pragma pack( [show] | [push | pop] [, identifier], n )
    n的取值可以为1,2,4,8…2^i

0x01. 对齐规则

在开始介绍对齐规则之前先介绍各类型对齐字节数定义:内置类型对齐字节数等于编译器内置大小;自定义类/结构体对齐字节数j等于max(各成员变量对齐字节数) 递归取值到内置类型。
规则:

  1. 如果通过预编译指令#pragma pack( [show] | [push | pop] [, identifier], n )指定内存对齐为i,类的对齐字节数为j,最终对齐字节数为m=min(i,j)。如果未指定,则直接取m=j。
  2. 成员变量放置位置计算规则:类的第一个成员变量放在offset为[0]位置,其余的成员变量假设其字节数为k,则放置的起始位置offset取值方式为:n=min(m, k)的整数倍。
  3. 最后整个类的大小应该是m的整数倍

0x02. 实战

例1. 未指定内存对齐

结构体A在未指定内存时根据规则1,m取值为4

struct 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值