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