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