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

C++内存对齐与布局优化

C++内存对齐与布局优化

内存对齐是编译器为了提高内存访问效率而采用的策略。理解内存对齐规则对于优化结构体大小和提高程序性能至关重要。

结构体的内存布局受对齐规则影响,可能包含填充字节。

#include
#include

struct Unaligned {
char a;
int b;
char c;
};

struct Aligned {
int b;
char a;
char c;
};

void alignment_basics() {
std::cout << "Unaligned size: " << sizeof(Unaligned) << "\n";
std::cout << "Aligned size: " << sizeof(Aligned) << "\n";

Unaligned u;
std::cout << "Offset of a: " << offsetof(Unaligned, a) << "\n";
std::cout << "Offset of b: " << offsetof(Unaligned, b) << "\n";
std::cout << "Offset of c: " << offsetof(Unaligned, c) << "\n";
}

alignas关键字可以指定变量或类型的对齐要求。

struct alignas(16) AlignedStruct {
int x;
int y;
};

void alignas_example() {
AlignedStruct s;
std::cout << "AlignedStruct size: " << sizeof(AlignedStruct) << "\n";
std::cout << "AlignedStruct alignment: " << alignof(AlignedStruct) << "\n";
std::cout << "Address: " << &s << "\n";
}

#pragma pack可以控制结构体的对齐方式。

#pragma pack(push, 1)
struct Packed {
char a;
int b;
char c;
};
#pragma pack(pop)

void pragma_pack_example() {
std::cout << "Packed size: " << sizeof(Packed) << "\n";

Packed p;
std::cout << "Offset of a: " << offsetof(Packed, a) << "\n";
std::cout << "Offset of b: " << offsetof(Packed, b) << "\n";
std::cout << "Offset of c: " << offsetof(Packed, c) << "\n";
}

缓存行对齐可以避免伪共享问题。

struct alignas(64) CacheAligned {
int value;
};

struct PaddedCounter {
alignas(64) int counter1;
alignas(64) int counter2;
};

void cache_line_alignment() {
PaddedCounter pc;
std::cout << "Size: " << sizeof(PaddedCounter) << "\n";
std::cout << "Offset of counter1: " << offsetof(PaddedCounter, counter1) << "\n";
std::cout << "Offset of counter2: " << offsetof(PaddedCounter, counter2) << "\n";
}

位域可以节省内存,但可能影响性能。

struct Flags {
unsigned int flag1 : 1;
unsigned int flag2 : 1;
unsigned int flag3 : 1;
unsigned int value : 29;
};

void bitfield_example() {
std::cout << "Flags size: " << sizeof(Flags) << "\n";

Flags f;
f.flag1 = 1;
f.flag2 = 0;
f.flag3 = 1;
f.value = 12345;

std::cout << "flag1: " << f.flag1 << "\n";
std::cout << "value: " << f.value << "\n";
}

联合体的所有成员共享同一块内存。

union Data {
int i;
float f;
char c[4];
};

void union_example() {
std::cout << "Union size: " << sizeof(Data) << "\n";

Data d;
d.i = 0x12345678;
std::cout << "As int: " << std::hex << d.i << "\n";
std::cout << "As bytes: ";
for (int i = 0; i < 4; ++i) {
std::cout << std::hex << (int)(unsigned char)d.c[i] << " ";
}
std::cout << "\n";
}

内存布局优化可以减少结构体大小。

struct Optimized {
double d;
int i1;
int i2;
char c1;
char c2;
short s;
};

void layout_optimization() {
std::cout << "Optimized size: " << sizeof(Optimized) << "\n";
}

理解内存对齐对于编写高效的C++代码至关重要,特别是在性能敏感的应用中。

http://www.jsqmd.com/news/862734/

相关文章:

  • 2026最新诚信优选 重庆市南川区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 上海市崇明区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 重庆市永川区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 【AI入门知识点】Skills 是什么?终于有人把 Skills、Function Calling、MCP 讲明白了
  • 一键营造立体感!OBS“半透明滤镜”上线,让直播间层次分明
  • 2026最新诚信优选 重庆市綦江区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 2026最新诚信优选 吕梁市离石区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 论文降重 + 消 AIGC 双难题?用 okbiye,我帮室友一周搞定毕业查重危机
  • TCP拥塞控制详解
  • 2026最新诚信优选 重庆市渝北区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • [网鼎杯 2020 朱雀组]Nmap-保姆级讲解
  • 《数据挖掘(主编:吕欣 王梦宁)》读书笔记:异常检测方法梳理与实践理解
  • 2026最新诚信优选 南京市高淳区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 论文双检卡脖子?okbiye 降重 + 去 AIGC 双 buff,助你一键通关毕业审核
  • 计算机二级 WPS 文字题:样式调整考点 详细解析
  • Agent的“记忆”与“约束”工程---->Agent协作
  • 2026最新诚信优选 重庆市渝中区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • RAG三大冲突与三大死穴及解决方案
  • HTTPS一文通
  • 2026最新诚信优选 南京市鼓楼区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 毕业季 “双率” 自救:okbiye 论文降重 | 降 AIGC,让你告别查重焦虑
  • 30天AI小白变高手:从零开始掌握AI画图、写文、做视频、提效变现!
  • 2026最新诚信优选 重庆市长寿区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • 企业AI合规:数据安全生死线
  • 用mitmproxy+Python脚本自动化抓取App数据流:从环境搭建到实战案例解析
  • 2026最新诚信优选 南京市建邺区黄金回收白银回收铂金回收彩金回收门店TOP5排行榜+联系方式推荐_转自TXT - 盛世金银回收
  • Fansly下载器完整指南:3步实现内容批量下载与离线收藏
  • 为什么所有 AI 对话都在用 SSE而不是WebSocket
  • LeetCode--513.找树左下角的值(二叉树)
  • 我的日常开发工具迭代|MonkeyCode实测存档