sizeof的小小总结

来源:互联网 发布:淘宝标题优化技巧视频 编辑:程序博客网 时间:2024/06/04 19:04

// 开始程序之前,需要了解这两条规则,哎,说实话,我对第一条还是比较清楚地
// 第二条的东西,我没有从实质上了解。前期就是这样理解偏移量就是output,结果
// 只能是最大类型的整数倍。

// 规则内容如下:
// 1.类型的大小是:类型包含的基本类型中最大的整数倍。 如下: sizeof(A)的大小是最大基本类型 double(8)的整数倍。
// 2.每个基本类型的偏移地址必须是类型大小的整数倍。
// 例如 int的偏移量必须是 0,4,8,12,16,….. double 的偏移量必须是0,8,16,24,32.
#include "stdafx.h"
#include <iostream>
using namespace std;
class A
{
 virtual ~A()
 {
  cout << "我是虚析构函数,我是占大小的!" << endl;
 }
 char d;
 double c;         
};
// 最大double为8,保持是8的整数倍,因此,先排virtual,四个
// 排后,然后填充四个。第二行,排一个char类型后,填充7个。
// double排8个。最后算出类的大小为,24。output also is twenty-four。

class B
{
 int a[5];
 char b[5];
 double c[5];
};
//  最大double为8,因此结果肯定为8的整数倍。int 的排列方式先排5个int型,之后
// 填充4个,然后排上5个char,填充3个,最后排40个double。 最后的结果为72.

class C
{
 A a;
 int b;
 char c;
};
// 首先看A和C中最大的基础类型,A和C中最大的基础类型为double型。因此结果必须为
// 8的整数倍。A的大小为24,int为4,char为1,最后结果为32.

class D
{
public:
 D(int a,char b,double d)
 {
  a = 0;
  b = ' ';
  d = 0.0;
  cout << "我是构造函数,我是不占大小的哦。。。" << endl;
 }
private:
 int a;
 char b;
 double c;
};
// 结果为16,构造函数不占大小的。

enum E
{
 oneday,twoday,threeday,fourday
};

// 枚举类型的大小就为四,不管里面存在的枚举量的多少。

union F
{
 int a;
 double b;
};
// 共用体的大小以最大元素的类型为基础。大的会把小的覆盖掉。

int main(int argc,char* argv[])
{
 const int a = 0;
 cout << sizeof(A) << endl;
 cout << sizeof(B) << endl;
 cout << sizeof(C) << endl;
 cout << sizeof(D) << endl;
 cout << sizeof(E) << endl;
 cout << sizeof(F) << endl;
 return 0;
}

原创粉丝点击