C++ 数据类型内存布局

探索不同处理器架构 (8, 16, 32, 64位) 如何影响基本数据类型的内存分配与对齐。

8-bit
16-bit
32-bit
64-bit
向下滚动探索

内存模型与字节对齐

内存控制

选择架构
结构体对齐模式

注意: 32位 double/long long 对齐假设为8字节 (常见于Linux/macOS),实际可能不同。

可视化示例结构体
struct Example { char c; // 1字节 short s; // 2字节 int i; // 4字节 double d; // 8字节 };
查看自定义结构体 (示例)
当前架构信息
字长: 4 字节
最大对齐: 8 字节
指针大小: 4 字节
内存块信息
悬停或点击内存中的数据块查看详情。

数据类型内存投影

点击下方类型卡片,观察其在当前架构下的内存占用和对齐方式:

类型投影详情
点击一个类型卡片将其投影到内存中。

结构体对齐方式比较

自然对齐 (默认)

总大小: ? 字节

紧凑排列 (Packed)

总大小: ? 字节

C++ 代码示例 (以32位架构为例)

#include // C++ 标准库,用于 size_t 等 // --- 示例结构体 --- struct MyStruct { char a; // 1 字节, 对齐 1 short b; // 2 字节, 对齐 2 int c; // 4 字节, 对齐 4 char d; // 1 字节, 对齐 1 double e; // 8 字节, 对齐 8 (常见 Linux/macOS 32/64位; Windows 32位可能对齐4) }; // --- 自然对齐 (编译器默认) --- MyStruct natural_instance; // sizeof(natural_instance) 通常为 24 字节 (假设 double 对齐为 8) // 布局: a[1] pad[1] b[2] c[4] d[1] pad[7] e[8] // --- 紧凑排列 (取消填充) --- // (语法可能因编译器而异, 此为 GCC/Clang 示例) struct __attribute__((packed)) PackedStruct { char a; // 1 short b; // 2 int c; // 4 char d; // 1 double e; // 8 }; PackedStruct packed_instance; // sizeof(packed_instance) = 1 + 2 + 4 + 1 + 8 = 16 字节 // 布局: a[1]b[2]c[4]d[1]e[8] // --- 使用 alignas (C++11) 强制对齐 --- struct AlignedStruct { alignas(16) char f; // f 本身 1 字节, 但其地址必须是 16 的倍数 int g; // g 为 4 字节, 对齐 4 }; // sizeof(AlignedStruct) >= 16 (结构体整体对齐要求是成员最大 alignas 或自然对齐要求) // 布局可能为: f[1] pad[15] g[4] pad[12] (总大小 32, 整体按 16 对齐)