马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 丶不离不弃 于 2019-12-8 03:04 编辑
最近在测试类的大小的时候遇到了个问题,首先我介绍下我问题的由来,代码如下,相关注释已经附在代码中:/*
memory alignment issues
0 1 2 3 4 5 6 7
0 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
8 [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ]
*/
//sizeof(A) = 32 bytes
class A {
private:
uint32_t a; // 4 bytes
uint8_t b; // 1 byte
// insert 3 bytes of dead space
double c; // 8 bytes
uint8_t d; // 1 byte
// insert 7 bytes of dead space
double e; // 8 bytes
public:
};
// write a class B to more efficiently pack
//sizeof(B) = 24 bytes
class B {
private:
uint32_t a; // 4 bytes
uint8_t b; // 1 byte
uint8_t d; // 1 byte
// insert 3 bytes of dead space
double c; // 8 bytes
double e; // 8 bytes
public:
此代码是为了求出一个类的大小,对齐原则就是按照最大的一个类型来对齐,但是我昨天在测试的时候发现了一个异常:
对于这段代码:#include <iostream>
using namespace std;
class A{
char a;//1
uint32_t b;//4
//insert 3 dead space
char c;//1
//insert 7 dead space
double d;//8
};
struct B {
double d;
char a;
int b;
char c;
};
int main() {
cout<< sizeof(A)<<endl;//24
cout<< sizeof(B)<<endl;//24
return 0;
}
按照上面我理解的空间分配,应该是char a;//1
uint32_t b;//4
char c;//1
//insert 2 dead space
double d;//8
所以这样求出来的大小是16.。。。。。我的理解也是这样的
但是确是这样分配的:char a;//1
uint32_t b;//4
//insert 3 dead space
char c;//1
//insert 7 dead space
double d;//8
请问哪位大神能告诉我这是为啥呢?难道char和int/uint32_t 在一起的时候分配是特殊情况吗??? |