sizeof小结

来源:互联网 发布:中国软件上市公司排名 编辑:程序博客网 时间:2024/06/06 02:02


一、用法
1. 用于数据类型

   sizeof使用形式:sizeof(type)

   数据类型必须用括号括住。如sizeof(int)。

2. 用于变量,表达式
  
   sizeof使用形式:sizeof(var_name)或sizeof var_name
                   sizeof(expr)      或sizeof expr
   ps. sizeof(expr) 时并不计算expr的值,它只返回存放该表达式的结果的类型的空间大小,特别的sizeof(*p),不需对p 解引用,p可以是个无效的地址
注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。
二、 结果
     sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
1.  若操作数具有类型char、unsigned char或signed char,其结果等于1(ANSI C正式规定字符类型为1字节)。
2.  int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double类型的sizeof 在ANSI C中没有具体规     定,大小依赖于实现
3.  对引用sizeof 返回存放此引用对象所需的内存空间大小
4.  例:
      char *c;//uninitiallize,only for test
      int len=sizeof(c);//len=4;
       len=sizeof(*c)//len=1;不解引用,c所指向的内容类型所需的空间
5.  当操作数具有数组类型时,其结果是数组的总字节数。

void test(int a[])
{
 //a 做为指针传递,相当于对指针取sizeof
 int len=sizeof(a)/sizeof(int);//b=4/4
}
int _tmain(int argc, _TCHAR* argv[])
{
 int a[]={1,2,3}; 
 int b=sizeof(a); //b=12//做为数组
 test(a); //做为指针传递
}

6. 结构,类,联合的 sizeof
   1.
class S1
{
};

int main(){
    cout < <sizeof(S1) < <endl;   //结果为1,为什么???
}
2.
class S1
{
     char c;
    // int i;
};

int main(){
    cout < <sizeof(S1) < <endl;   //结果为1
}
3.
class S1
{
   //  char c;
     int i;
};

int main(){
    cout < <sizeof(S1) < <endl;  //结果为4
}

4.
class S1
{
     char c;
     int i;
};

int main(){
    cout < <sizeof(S1) < <endl;  //结果为8,为什么????
}

5、
class A
{
public:
      int b;
      float c;
      char d;
};
int main(void)
{
   A object;
   cout    <  < "sizeof(object) is "    <  < sizeof(object)    <  < endl;   //结果为12
   return 0 ;
}

6.
class A
{
public:
      static int a;
      int b;
      float c;
      char d;
};

int main()
{
   A object;
   cout    <  < "sizeof(object) is "    <  < sizeof(object)    <  < endl;  //结果还是12,为什么????
   return 0 ;
}

7.
class A
{
public:
      static int a;
      int b;
      float c;
      char d;
      int add(int x,int y)
      {
        return x+y;
      }
};

int main()
{
   A object;
   cout    < < "sizeof(object) is "    < < sizeof(object)    < < endl;  //结果仍然是12
   int b = object.add(3,4);
   cout    < < "sizeof(object) is "    < < sizeof(object)    < < endl;   //结果仍然是12

   return 0 ;
}
8.
class A{
        char f;
        double c;
        char d;
};
int main(){
    A a;
    cout < <sizeof(a) < <endl; //结果为24,为什么?????
}

9.
class A{
        double c;
        char d;
        char f;  
};
int main(){
    A a;
    cout < <sizeof(a) < <endl;//char f;颠倒位置结果为16,为什么?????
}


1. 最少为1
2. 这个不用说了,大家都知道;
3, 也不用说;
4, 这是字节对齐的问题,char后面的int被放到了char的后四个字节的地方,是编译器的问题。这个自己可以自定义。
5, 3*4 = 12
6, static不在堆上
7, 结果仍然是12 ,不是虚函数,函数指针不在类中,如果函数里有一个virtual function,那么sizeof的值才会增加4个字节,(先不考虑具体的对齐)
8, 3*8 = 24 为了更快地访问到double
9, 8 + 8 = 16

具体原因参考:

http://blog.csdn.net/felixsxt/archive/2008/05/13/2442054.aspx
http://blog.csdn.net/felixsxt/archive/2008/05/13/2442062.aspx

原创粉丝点击