C++ class 数据对齐优化的问题?

2019-01-23 09:13:12 +08:00
 sl0000
class MyClass1 {
public:
	int a;
	char c1;
	int b;
	char c2;	
};

class MyClass2 {
public:
	int a;
	int b;
	char c1;
	char c2;
};

sizeof(MyClass1); // 16

sizeof(MyClass2); // 12

不能自动数据对齐优化, 这是我的编译器的问题吗? class size 的影响有多大?

我的理解是数据对齐优化后, 能略微减少内存开销;

3225 次点击
所在节点    C
17 条回复
meik2333
2019-01-23 09:18:09 +08:00
如果这种地方自动优化了,那么要怎么通过指针加偏移量来访问成员呢...
felixlong
2019-01-23 09:20:10 +08:00
你理解错了。
1 数据对齐优化是指 根据数据类型的大小以访问最快的方式来对齐。比如 int 按 4byte 对齐。longlong 以 8byte 来对齐。
2. 根据 c/c++对 structure 的规则。编译器是不可以改变 class 里面成员顺序的。
sl0000
2019-01-23 09:27:36 +08:00
你是说通过指针加偏移量来访问私有成员?
mxi1
2019-01-23 09:29:01 +08:00
@meik2333 c++类的内存排布与 c 的结构体是不一样的, 不能去假设内存偏移和成员变量的对应关系;
wizardoz
2019-01-23 09:31:14 +08:00
#pragma pack(1)
mxi1
2019-01-23 09:32:43 +08:00
C++类的构造函数会根据成员变量声明的顺序进行初始化; 楼主说的"优化",可能会与之冲突. 我猜这是一个原因吧.
wizardoz
2019-01-23 09:32:58 +08:00
@wizardoz 不好意思,有点答非所问。其实第一个结构体就是一种优化,只不过它是寻址效率上的优化而不是存储空间上的优化。
josephpei
2019-01-23 09:57:57 +08:00
数据对齐优化是加速寻址速度,会浪费内存空间,不是减少内存空间开销,简单说就是用空间换时间
raynor2011
2019-01-23 10:05:29 +08:00
内存对齐优化就是 memory access 的优化啊,并不是指优化存储空检,优化存储空间最直接的就是关闭内存对齐优化
meik2333
2019-01-23 10:05:44 +08:00
@mxi1 这个我不是很清楚,谢谢指正啦
glacer
2019-01-23 10:25:58 +08:00
楼主是 32 位机器?
sl0000
2019-01-23 10:27:58 +08:00
@glacer 64bit
ian511
2019-01-23 10:30:44 +08:00
Pragma 正解
fromxt
2019-01-23 10:31:42 +08:00
@meik2333 sizeof(MyClass1); // 16 这个编译器已经做了自动数据对齐优化, 当一个 char 变量独立存在时,会分配一个 int 大小的空间。默认 4 字节对齐的话。至于你说编译器能自动把你的 MyClass1 优化成 MyClass2,这得靠写代码的人吧?字节对齐的主要目的是提高 CPU 访问数据的效率。例如,32 位 CPU 地址为 4 的倍数,一次内存访问就可以读出数据。
lrxiao
2019-01-23 11:31:07 +08:00
C/C++应该是标准要求不能优化

Rust 是自动重排的,还有复用 invalid state(niche filling)的操作
kljsandjb
2019-01-28 22:12:34 +08:00
从大到小写吧,对齐比较友好
wingpui
2019-02-03 02:35:21 +08:00
@wizardoz
@ian511
正解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/529661

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX