不含虚函数的结构体及类大小计算
空类或空结构体的大小为1,如:
#include <iostream>
using namespace std;
class A
{};
struct B
{};
int main()
{
int size = 0;
size = sizeof(A);
std::cout<<"empty class size :"<<size<<std::endl;
size = sizeof(B);
std::cout<<"empty struct size :"<<size<<std::endl;
return 0;
}
普通类:
class D
{
int i;
short j;
char ch;
};
的计算方法
1、第一个 4
2、第二个 2
4+2=6, 6/2=3,能整除。
3、第三个 1
6+1=7, 7/1=7,能整除。
4、最大的字节为4,则有
(7+1)/4=2
于是此类的大小为7+1=8
若再增加一个 int i1,
z则计算方式:
7 + 4 = 11
(11+1) /4 = 3
故类大小为12
其他规则
函数和静态变量不占有大小。其他变量都参与对齐规则,包括,成员指针变量,虚函数指针,成员枚举变量。
类内指针举例
#include <iostream>
using namespace std;
class A
{
static int a;
char a2;
char* ptr1;
};
int main()
{
int size = 0;
size = sizeof(A);
std::cout << "class A size :" << size << std::endl;
return 0;
}
继承(虚继承,继承)n个带有虚函数的基类,则增加一个sizeof(ptr) * n个字节的虚函数表指针。
带pragma pack(n)的,两个计算规则变成:
局部对齐:n和当前变量较小的那个作为除数,
整体对齐
如果n比成员变量中占字节最大的成员变量大,则除数为占字节最大的成员变量所占的字节数
#pragma pack(2)
#include <iostream>
using namespace std;
class A
{
char a2;
char a3;
char a1;
};
int main()
{
int size = 0;
size = sizeof(A);
std::cout << "class A size :" << size << std::endl;
return 0;
}
如果n比成员变量中占字节最大的成员变量小,则除数为n
#pragma pack(2)
#include <iostream>
using namespace std;
class A
{
char a2;
char a3;
char a1;
int a4;
};
int main()
{
int size = 0;
size = sizeof(A);
std::cout << "class A size :" << size << std::endl;
return 0;
}
类内空数组被编译器优化,不占用内存。
#include <iostream>
using namespace std;
class A
{
static int a;
char a2;
char* ptr1;
short array[];
};
int main()
{
int size = 0;
size = sizeof(A);
std::cout << "class A size :" << size << std::endl;
return 0;
}