为什么 char 的大小在内存中是 4 个字节,而空类是 1 个字节
Why size of char is 4 bytes in memory and empty class is 1 byte
一天中的好时光!
我写了一些代码,但我无法理解一些奇怪的内存异常。有谁能用课堂记忆有适当的知识给我一个解释吗?
我的代码:
#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 个使其正确对齐。
相关文章:
- C++ int* 和 char* 字节顺序已交换
- 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- 如何在 CPP 中将 Typedef basic_string字符串转换为<char>字节数组
- 用字节初始化 char* 和 std::字符串
- 将二进制字节 (char*) 转换为 uint64_t*,是否安全
- 使用最高字节"int"优化"char"的异或
- C++ 如何将 char[] 中的多个字节转换为一个整数
- 如何在-120到120之间更改int到char(或其他简单保存为一个字节的简单方法)
- 将字节数组作为char*从C#传递到C++DLL
- 文件名如何在"char"和2字节字符之间工作
- 如何创建 std::vector of char/std::byte,其中第一个字节对齐到 16 个字节,但没有填充
- C++/C:Char[]的前缀长度(以字节为单位)(二进制/十六进制)
- 在 linux/mac 中获取多字节字符的"char"
- C 2字节阵列计算(char阵列,字符串和整数)
- 为什么我不能从铸造的字节(char)数组中调用虚拟函数
- 如何将浮点转换为长度为4的字节阵列(char*的阵列)
- 删除字节转换的char*
- 在C++中使用什么来进行uint8或char的字节操作
- 使用 uint8_t 或 char 来表示以字节排列的二进制数据更好吗?
- XLookupString不检测2字节char语言