一天中的好时光!
我写了一些代码,但我无法理解一些奇怪的内存异常。在课堂记忆中有适当知识的人能给我一个解释吗?我的代码:
#include <iostream>
using namespace std;
class O
{
O();
~O();
};
class A
{
public:
A();
~A();
void someFunc();
private:
int m_a;
};
class B: public A
{
public:
B();
virtual ~B();
private:
int m_b;
};
class C: public B
{
public:
C();
~C();
private:
char m_c;
};
int main()
{
cout << sizeof(char) << endl;
cout << sizeof(int) << endl;
cout << sizeof(O) << endl;
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
cin.get();
return 0;
}
输出:
1 //normal for char
4 //normal for int on x32
1 //why empty class occupies 1 byte?
4 //int m_a. Where is 1 byte?
12 //4B virtual function, 8B - m_a and m_b.
16 //char needs 1 byte. Why it gets 3 more?
感谢您的关注和回答)
答案 0 :(得分:4)
空类:每个完整对象必须具有唯一的地址。考虑EmptyClass a[10]
,以及数组元素是完整对象的事实,并考虑指针算法的工作原理。
int m_a
?你的假设是没有根据的。如果你已经有了有意义的字节,就不需要额外的虚拟字节。
C
:填充。再次考虑数组和对齐。类C
的对齐方式为int
,C a[10]
的每个数组成员都必须对齐,数组成员必须是连续的。
答案 1 :(得分:1)
O
(空类):为了解决该类,它必须至少分配1个字节的空间。你不能处理小于一个字节的任何东西。
A
(具有单个int成员的类):其成员加起来为一个整数的空间。这就是它所需要的,并且没有对齐问题。
B
(具有另一个int成员和vtable的Decrived类):它的空间要求将由2个int和vtable决定。因此额外的4个字节(指向32位机器上的vtable的指针)。
'C'(带有另一个char的派生类):它包含来自B
和1个字节(char
)的所有内容,再加上3个以使其正确对齐。