由于编译器不同相同代码的类,大小可能不同,此处测试环境为Win 7 x64,Visual Studio 2013 Community.(C++ 11)
使用关键字 sizeof 获取变量和对象大小。
使用(int)& 获取地址。
首先是简单类:
类 A ,我们存放 1个char,1个int,1个double;
class A {
char c='A';
int n= 0 ;
double d=0.0;
public:
void print(){
std::cout
<< "&A :" << (int)&(*this)
<< "\n&c :" << (int)&c
<< "\n&n :" << (int)&n
<< "\n&d :" << (int)&d
<<std::endl;
};
};
测试代码:
int main()
{
std::cout
<< "size of char :" << sizeof(char)
<< "\nsize of int :" << sizeof(int)
<< "\nsize of double :" << sizeof(double)
<< std::endl;
A a;
a.print();
std::cin.get();
return 0;
}
结果如下:
从c 到 n 用了4个字节,用3个字节补齐,与 n 的大小相等,说明变量使用大小向后对齐。
将 char c=’A’; 和 double d=0.0; 调换,再进行测试结果如下:
总共大小为16,而最后的变量 c 后面还有3个字节,但此时已经没有需要对齐的变量类型,考虑为类型整体大小需为4的整数倍。
进行验证:
class B {
char a ='a';
};
class B1{
int a = 0;
};
class B2{
double a = 0.0;
};
int main()
{
B b;
B1 b1;
B2 b2;
std::cout
<< "size of b :" << sizeof(b)
<< "\nsize of b1 :" << sizeof(b1)
<< "\nsize of b2 :" << sizeof(b2)
<< std::endl;
std::cin.get();
return 0;
}
结果如下:
然而并不是所有类大小需为4的整数倍大小。考虑为类中最大类型大小的整数倍。
class D{
char c;
double d;
};
int main()
{
D d;
std::cout
<< "size of d :" << sizeof(d)
<< std::endl;
std::cin.get();
return 0;
}
结果如下:
为char c 获取了8个字节,与double对齐。整体大小为8的倍数
class E{
char c;
struct { char c[9]; }p;
double d;
public:
void print(){
std::cout << "&e :" << int(&(*this))
<< "\n&c :" << (int)&c
<< "\n&p :" << (int)&p
<< "\n&d :" << (int)&d
<< std::endl;
};
};
int main()
{
E e;
std::cout
<< "size of e :" << sizeof(e)
<< std::endl;
e.print();
std::cin.get();
return 0;
}
结果如下:
由于两个相邻变量类型相同,自动无缝拼接,与后一个不同类型大小的整数倍对齐。整体为8的倍数24。
为检验是否整体为8的倍数,在最后添加: char s; 看看会多出多少字节。
结果如下:
虽只增加1个字节的变量,却多出8个字节。再将double替换为int。
结果如下:
最大类型大小为4,因此补齐至4的整数倍。
所以结论为前一个变量会补齐至后一个不同类型变量的整数倍大小,最后一个变量 补齐整体大小 至 最大变量的整数倍大小。
前提是相同测试环境。。。。