目录
一、程序及输出
1.1 空类字节数
c
#include<iostream>
using namespace std;
class Person
{
};
void test01()
{
//空类的sizeof结果是1 原因 每个对象都应该在内存上有独一无二的地址,因此给空对象分配1个字节空间
Person p1;
// 空对象 大小 1
cout << "sizeof = " << sizeof(p1) << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出:
根据C++标准,空类的sizeof结果至少是1。这是因为在C++中,每个对象都应该有一个独一无二的地址,因此即使是空类也应该占据至少一个字节的内存空间。
然而,一些编译器在对空类进行内存对齐时可能会分配更多的内存空间,以便满足特定的对齐要求。例如,一些编译器可能会将空类的sizeof结果设置为4或8,以便将空类的对象对齐到4字节或8字节边界上。
1.2 非空类字节数
c
#include<iostream>
using namespace std;
class Person
{
public:
int m_A; //只有非静态成员变量 属于类对象上
void func( )//成员函数 并不属于类对象上
{
}
static int m_B; //静态成员变量 不属于类对象上
static void func2()//静态成员函数 不属于类对象上
{
}
double m_C;
};
int Person::m_B = 0;
void test01()
{
Person p1;
cout << "sizeof = " << sizeof(p1) << endl;
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
输出:
只有非静态成员变量 属于类对象上
因此:
int 4字节+double8字节=12字节,但是因为大多数编译器的内存对齐规则,最终的字节数是字节对齐的值的倍数,
因此2x8=16字节。
结构体和类的对齐规则通常是其成员中对齐要求最大的那个成员的大小
1.3 设置对齐方式的数值
代码不动,添加一句 #pragma pack(1)
c
#include<iostream>
using namespace std;
......
#pragma pack(1) //设置默认对齐数
class Person
{
public:
int m_A; //只有非静态成员变量 属于类对象上
void func( )//成员函数 并不属于类对象上
{
}
static int m_B; //静态成员变量 不属于类对象上
static void func2()//静态成员函数 不属于类对象上
{
}
double m_C;
};
........ 省略
此时输出:
12已经是1的倍数。
二、分析与总结
数据成员大小:
C++ 对象的大小取决于其数据成员的大小。基本数据类型(如 char、int、double 等)的大小是固定的,通常是根据平台的架构决定的。结构体和类的大小是其所有成员变量大小的总和。
对齐方式:编译器为了提高访问内存的效率,通常会要求数据成员按照特定的字节边界对齐。这个字节边界由编译器和平台决定,可以使用 alignof 运算符或 #pragma pack(show) 来查看当前的对齐方式。