现代C++的核心准则(上)

一、前言

二、编写优质的代码

1.

2.

3.

4.

5.

6. 内存优化

1. 内存对齐规则

在C语言中,结构体的成员会按照内存对齐原则进行排列,确保每个成员的起始地址是其类型大小的整数倍。32位系统下:

  • char:1字节对齐
  • int*(指针):4字节对齐
  • double:通常4字节对齐(32位系统可能按4或8对齐,此处假设4)

结构体总大小需为最大成员对齐值的整数倍

2. product1的内存布局分析

struct product1 {
    char e, w, s, n;   // 连续4个char,占4字节
    int* address;      // 需4字节对齐,起始地址4(无需填充)
    double price;      // 需4字节对齐,起始地址8(无需填充)
};

总大小计算​:
4(char) + 4(int*) + 8(double) = 16字节
无需额外填充,且16是最大对齐值(4)的整数倍。

3. product2的内存布局分析

struct product2 {
    char e, w, s;       // 3字节,需填充1字节以满足int*的4对齐
    int* address;       // 起始地址4,占4字节
    double price;       // 起始地址8,占8字节
    char n;             // 1字节,末尾需填充3字节以满足总大小对齐
};

总大小计算​:
3(char) + 1(填充) + 4(int*) + 8(double) + 1(char) + 3(填充) = 20字节
由于末尾需要填充到4的倍数,总大小增加到20字节。

4. 关键对比

结构体有效数据填充字节总大小
product116字节016
product217字节320
  • 空间效率​:product1无填充浪费,而product2因成员顺序不当导致3字节填充。
  • 缓存友好性​:紧凑的内存布局(如product1)更利于CPU缓存命中,提升性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值