sizeof用法汇总

sizeof用法

一、sizeof的概念
sizeof是C语言的一种单目操作符,尤其注意的是,它不是一个函数。sizeof接收一个操作数,操作数可以是一个表达式或者是括在括号内的数据类型名。sizeof操作符以字节形式给出其操作数的栈存储大小。
sizeof不是函数,也不是运算符,它是个类似宏定义的关键字,sizeof()括号内的内容不会被编译,而是被类型所替代。
例如:
int a = 8;
sizeof(a);


其中,sizeof(a)将会被替代成sizeof(int).
sizeof(a = 6);


其中,括号中的内容不会编译执行,即a = 6不执行,而是替换成sizeof(int)。

二、sizeof的用法
1、操作数是数据类型
sizeof(数据类型),且数据类型必须放在括号里,比如:sizeof(int)。
2、操作数是变量
sizeof(变量),变量也可以不放在括号里。

三、sizeof的结果
一般情况下,sizeof的结果大都依赖与编译器类型(UNIX,MS),所以不同编译器对数据类型的定义也不一样。
sizeof的结果类型被定义为size_t,其中size_t被定义为unsigned int。
1、若操作数为char、unsigned char或signed char时,其结果为 1;
2、其它如int、long、float、double依赖于编译器的定义。
在vs2008中基本数据类型占用的字节数如下:
sizeof(char) == sizeof(bool) == 1;
sizeof(short) ==2;
sizeof(int) == sizeof(long) == sizeof(float) ==4;
sizeof(double) == 8;


3、当操作数为指针时,也是依赖于编译器,但一般为指针字节数为4;
4、当操作数具有数组类型时,其结果是数组的总字节数。但是,如果操作数是函数中的数组形参或函数类型的形参时,sizeof给出其指针的大小;
  int a[2];   sizeof(a) == 2*4=8;
  void fun(int arr[])
  {
      cout<<sizeof(arr)<<endl;
  }


  输出:4
5、当操作数是联合(aggregate)类型时,sizeof结果是其最大字节成员的字节数;列如:
  union test{
     int a;
     char ch;
  };
  sizeof(test) == sizeof(int) == 4;


6、当操作数是结构体类型时,sizeof结果是结构体的总长度,包括任何的填充字节。例如:
struct test{
   char ch;
   double  d;
};


一般情况下,sizeof(test) == 16;实际上就是sizeof(test)=sizeof(char) + 7 + sizeof(double) == 16,这里涉及到结构体数据对齐问题。


除了以上6点之外,还要注意下面的问题:
1、不要把sizeof当成函数,也不看作是一元操作符,把它当成一个特殊的编译预处理。
  int a =0;
  cout<<sizeof(a = 6)<<endl;
  cout<<a<<endl;


输出结果为:4
           0
2、自定义类型的sizeof同等于它的类型原形。
  typedef  char  BYTE;
  typedef  long  DWORD;
  sizeof(BYTE) == sizeof(char);
  sizeof(DWORD) == sizeof(long);


3、不管是什么类型的指针,大小都是4。
   sizeof(int *) == sizeof(char*) == sizeof(long*) == sizeof(double*);


4、数组的大小是个维数的乘积*数组元素的大小。
   int a[2][4];  
   sizeof(a) == 32 == 2*4*sizeof(int);


5、字符串的sizeof和strlen的区别
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。
  char str[] = "abcd";
  cout<<strlen(str); // 4,字符串长度
  cout<<sizeof(str); // 5,字符串容量
  str[1]= '\0';
  cout<<strlen(str); // 1,字符串长度
  cout<<sizeof(str); // 5,字符串容量



判断类的sizeof:
1、空类的sizeof为1,类中的成员函数不占用栈的空间,其存储在数据段中;
2、若类中包含成员变量,计算方法与结构体struct的计算方法一致,静态成员变量不占用栈空间,其存储在静态数据区;
3、若类中有虚函数,或者其父类或者祖先中有虚函数,则子类的每个对象中保存一个指向虚函数表(vtable)的指针vptr,占用4字节栈空间;
4、子类完全继承父类中的成员变量,不论是何种类型(public,private,protected);
5、子类和父类中都有虚函数时,在子类中其实只有一个虚函数表(多重继承除外),因此子类对象中只保存一个虚函数表指针;
6、当在多重继承中,多个父类含有虚函数时,子类中有多个虚函数表,数量等于含有虚函数的父类的个数,其中子类中的虚函数只保存在第一个继承的含有虚函数的父类的虚函数表中,因此子类的对象中有多个虚函数指针。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值