对象的布局
Layout of an object
我想了解对象的布局。所以我用不同顺序的成员变量执行。一切如愿以偿,期待着接下来的序列。
#include <iostream>
using namespace std;
class Test1
{
public:
int m_a;
char m_b;
};
class Test
{
public:
int m_b;
Test1 m_t;
char m_g;
char m_c;
char m_d;
int m_e;
};
int main()
{
Test t;
cout<<(int*)(&t.m_b)<<endl;
cout<<(int*)(&t.m_t.m_a)<<endl;
cout<<(int*)(&t.m_t.m_b)<<endl;
cout<<(int*)(&t.m_c)<<endl;
cout<<(int*)(&t.m_d)<<endl;
cout<<(int*)(&t.m_e)<<endl;
cout<<sizeof(t)<<endl;
}
输出:
0xbfebbd6c
0xbfebbd70
0xbfebbd74
0xbfebbd79
0xbfebbd7a
0xbfebbd7c
20
如我所料16。
但是,如果我从Test1中移除m_a,它将给出预期的输入(12)。
#include <iostream>
using namespace std;
class Test1
{
public:
char m_b;
};
class Test
{
public:
int m_b;
Test1 m_t;
char m_g;
char m_c;
char m_d;
int m_e;
};
int main()
{
Test t;
cout<<(int*)(&t.m_b)<<endl;
cout<<(int*)(&t.m_t.m_b)<<endl;
cout<<(int*)(&t.m_c)<<endl;
cout<<(int*)(&t.m_d)<<endl;
cout<<(int*)(&t.m_e)<<endl;
cout<<sizeof(t)<<endl;
}
输出:
0xbf82e674
0xbf82e678
0xbf82e67a
0xbf82e67b
0xbf82e67c
12
如果我去掉与4位边界完全对齐的整数,为什么会有8个字节的差异?
PS:我知道这是具体实施的。我想知道是如何实现的:)。这是因为我想访问私人成员,所以试图了解对象布局!!!
对于整数m_a
,sizeof(Test1)
为8,将m_a
与4字节边界对齐。如果没有int,它只是第th个char
的大小。
class Test
{
public:
int m_b; // 4
Test1 m_t; // 12
char m_g; // 13
char m_c; // 14
char m_d; // 15
int m_e; // 20
};
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 如何在qt中将对象添加到现有布局中?--已解决
- C++对象布局是否必须静态定义?
- 在C++标准中记录对象的内存布局的哪个位置?
- 在标准布局对象中进行指针运算(例如,使用偏移量)时,我们是否需要使用 std::launder?
- 何时可以与相应的完整对象类型具有不同的布局
- 非结构对象布局
- C++对象内存布局
- 对象/结构等的C++内存布局是什么?
- 对象的布局
- c++中虚拟继承的对象布局
- 公共和私有对对象的内存布局是否有任何影响
- 对象的二维几何布局
- 包含容器的对象的C++布局
- 关于对象内存布局的假设
- C++11 标准是否保证initializer_list对象的内存布局与交叉编译器兼容?
- 编译器构造 - C++中多个继承对象的内存布局