sizeof求类的大小

用sizeof求类的大小,http://blog.csdn.net/szchtx/article/details/10254007(sizeof浅析(三)——求类的大小),这篇博文给出了非常详尽的举例介绍。

但是细心的话,你会发现一个小瑕疵,那就是对如下例子求sizeof(B),在VS下是16不是12!

class A
{
public:
    int a;
private:
    char b;
};
class B : public A
{
public:
    int d;
    char c;
	
};

以下是我根据上机实验结果,总结的精华要点,希望从此以后不再为sizeof求类大小而烦忧:

注:以下是针对32位编译器而言

1. sizeof计算类的大小时,针对是该类型的实例,与该类型本身无关

2. sizeof(空类)=1,这是由编译器决定的,因为实例化一个空类也需要在内存中占用空间

3. 继承树中,不管是虚继承还是普通继承,同一层级中,不管虚多少次,只能算一次+4,不算的等同于注掉

4. 继承树中,不管是虚继承还是普通继承,跨层级凡是发现虚函数同名的,只能算一次,不算的等同于注掉

5. 虚继承,在继承树中每虚继承一次+4

6. 虚继承,跨层级只要虚函数不同名,就各自分别算一次+4

7. 普通继承,跨层级不管有多少虚函数,只能算一次+4,不算的等同于注掉

8. 静态变量不在类大小计算范围之内

9. 注意偏移对齐的问题,结果为4的整数倍,当int和doulbe在一起时向doulbe对齐,言外之意结果为8的整数倍

学技术有感:有时候不能太过于专牛角尖,因为很多时候结果怎么样完全取决于编译器内部是如何实现的,理解其用意或者思想即可,对完全黑盒的东西只能瞎试或瞎猜,太过深究是没有意义的。

原文地址:https://www.cnblogs.com/researcher/p/4548089.html