为什么 char 的大小在内存中是 4 个字节,而空类是 1 个字节

Why size of char is 4 bytes in memory and empty class is 1 byte

本文关键字:字节 char 内存 为什么      更新时间:2023-10-16

一天中的好时光!

我写了一些代码,但我无法理解一些奇怪的内存异常。有谁能用课堂记忆有适当的知识给我一个解释吗?

我的代码:

#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?

感谢您的关注和回答)

  • 空类:每个完整的对象都必须有一个唯一的地址。考虑EmptyClass a[10],以及数组元素是完整对象的事实,并考虑指针算术的工作原理。

  • int m_a ?你的假设是没有根据的。如果您已经有有意义的字节,则不需要额外的虚拟字节。

  • C:填充。同样,考虑数组和对齐方式。类 C 将具有 int 的对齐方式,并且C a[10]的每个数组成员都必须对齐,并且数组成员必须是连续的。

O

空类):为了对类进行寻址,它必须至少分配 1 个字节的空间。 不能寻址小于字节的任何内容。

A(具有单个 int 成员的类):其成员加起来相当于单个整数的空间。 这就是它所需要的,没有对齐问题。

B(具有另一个 int 成员和一个 vtable 的派生类):它的空间要求将由 2 个 int 和 vtable 决定。 因此,额外的 4 个字节(指向 32 位机器上的 vtable 的指针)。

"C"(带有另一个字符的派生类):它包含 B 中的所有内容,以及 1 个字节(char),再加上 3 个使其正确对齐。