C++内存对齐

题目

cpp 复制代码
class aa 
{
    char a;
    int b;
    char c;
};
class bb
{
    char a;
    char b;
    int c;
};

std::cout << sizeof(aa)<<std::endl;
std::cout << sizeof(bb) << std::endl;

解释

cpp 复制代码
结构体内存对齐是指结构体成员在内存中的存放位置必须满足特定的地址对齐规则,以提升访问效率并保证跨平台兼容性。它不仅影响结构体的大小,还直接关系到性能和硬件可访问性。

核心规则

首成员规则:第一个成员的偏移量为 0。

成员对齐:每个成员的起始地址必须是 min(成员类型大小, 编译器默认对齐数) 的整数倍。

结构体整体对齐:结构体总大小必须是其最大对齐数的整数倍。

嵌套结构体:嵌套成员需按其自身最大对齐数对齐,整体大小取所有最大对齐数的整数倍。

为什么需要对齐

硬件限制:部分 CPU(如 ARM)不支持非对齐访问,否则会触发异常。

性能优化:对齐数据可一次性读取,减少总线周期;未对齐可能需要多次访问。

跨平台兼容:不同平台对齐要求不同,对齐可避免数据结构在不同平台上表现不一致。

对齐控制方法

#pragma pack(n):修改默认对齐数(n 通常为 1, 2, 4, 8)。

alignas(n) / __attribute__((aligned(n))):C11/C++11 标准方式,控制整体对齐。

__attribute__((packed)):取消填充,实现紧凑布局(可能降低性能)。

解析答案

cpp 复制代码
class aa 
{
    char a;
    int b;
    char c;
};
内存分布
■ . . .
■ ■ ■ ■
■ . . .
3*4=12
所以为12个字节

class bb
{
    char a;
    char b;
    int c;
};
内存分布
■ ■ . .
■ ■ ■ ■
2*4=8
所以为8个字节
相关推荐
大衛說1 小时前
《Python 从入门到精通》系列总览与学习路线
开发语言·python·学习
学习星球2 小时前
单调栈——从“找下一个更大的“到柱状图中的最大矩形
数据库·c++·算法·leetcode·xcode
可乐鸡翅yeah_2 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线
2601_962203512 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理3 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
小灰灰搞电子3 小时前
C++ 引用折叠详解
c++
来了就未晚3 小时前
Python基础 学习代码存储与命名规范
开发语言·python·学习
布莱克6053 小时前
数组详解:定义、作用、应用场景及与链表的区别(C/C++ 代码讲解)
c语言·开发语言·c++·数组
hongmai6668884 小时前
MP2348GTL-Z:这颗24V/4A同步降压芯片,把性能和体积平衡得恰到好处
c语言·开发语言·arm开发·单片机·5g
多弗朗皮卡丘4 小时前
C语言梦开始的地方19:文件操作
c语言·开发语言