C/C++中的sizeof分析

来源:互联网 发布:推广淘宝产品 编辑:程序博客网 时间:2024/05/18 02:45
1.1  基本概念

sizeof是C语言中的一种单目操作符,它并不是函数。它以字节形式给出了其操作数的存储大小。不同的操作系统和编译器可能会有不同的结果。下面的测试结果是在Win10 TDM-GCC  4.8.164-bit  Release获取的。

 

1.2  使用方法

1.2.1  用于基本数据类型

使用形式: Sizeof(type)

Sizeof(int)       //4

Sizeof(float)     //4

Sizeof(double)   //8

 

1.2.2  用于变量

 

使用形式: Sizeof(var_name)

 

注意:sizeof操作符不能用于函数类型、不完全类型指具有未知存储大小的数据类型、如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。

 

例如:sizeof(max)        --若此时变量max定义为int max();

    sizeof(char_v)  --若此时char_v定义为char char_v[MAX]且MAX未知,

    sizeof(void)      

  以上都是不正确形式。

 

 

1.3  样例测试结果

 

1.3.1  ANSI  C正式规定字符类型为1字节

 

printf("%d\n",sizeof(char));            //1

printf("%d\n",sizeof(unsignedchar));    //1

printf("%d\n",sizeof(signedchar));      //1

 

1.3.2  其他类型在ANSI  C中没有具体规定,大小依赖于平台

 

       printf("%d\n",sizeof(int));                       //4

   printf("%d\n",sizeof(unsigned int));               //4

   printf("%d\n",sizeof(short int));                  //2

   printf("%d\n",sizeof(unsigned short));             //2

   printf("%d\n",sizeof(long int));                   //4

   printf("%d\n",sizeof(unsigned long));             //4 

   printf("%d\n",sizeof(float));                     //4

   printf("%d\n",sizeof(double));                    //8

   printf("%d\n",sizeof(long double));               //16

 

 

1.3.3  当操作数是指针时,sizeof依赖于编译器

 

Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。

    一般Unix/Linux的指针字节数为4。    

    例如: char*p;      

          printf("%d\n",sizeof(p));                   //8            

 

 

1.3.4  当操作数具有数组类型时,其结果是数组的总字节数

 

       chara[5];

       intb[5];

       printf("%d\n",sizeof(a));     //5

       printf("%d\n",sizeof(b));     //20

 

 

1.3.5  当操作数是具体的字符串或者数组时,会根据具体的类型进行相应转化

 

       printf("%d\n",sizeof(8));      //4

       printf("%d\n",sizeof(8.1));    //8  默认是double类型

       printf("%d\n",sizeof("ab"));   //3

 

第三个样例会将字符串自动转化为数组类型,因为在最后加上了’\n’符

 

 

1.3.6  当操作数是联合类型或结构体类型

 

当操作数是联合类型时,sizeof是其最大字节成员的字节数。

当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。

 

union u {

       charc;

       doubled;      

}u;

 

struct s{

       charc;

       doubled;

}s;

       printf("%d\n",sizeof(u));     //8

       printf("%d\n",sizeof(s));     //16

对于样例二,一般而言sizeof(char) + sizeof(double) = 9; 
  这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。

    但如果全对齐的话,sizeof(a) =16, 这是因为b被放到偏移量为0的地址,占1个字节;

    在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节,

    达到8个,这时候偏移量为8,放上x后长度为16。

    在此例中,所有的结构成员都要放在被8整除的地址,这里补7个字节,所以为16。

 

1.3.7  当操作数是函数中的数组形参或函数类型的形参

 

sizeof给出其指针的大小,我的平台上值为8。

void fun(char aa[1000]){     

       printf("%d\n",sizeof(aa));    // 8      

}

char *p;

fun(p);

 

1.3.8  其他的一些细节样例

 

       chararr1[] ={'h','e','l','l','o'};

       chararr2[] ="hello";

       printf("%d\n",sizeof(arr1));     // 5

       printf("%d\n",sizeof(arr2));     // 6   会加上’\n’结束

      

       chararr3[20] = "hello";

       chararr4[] = "hello";

       printf("%d\n",sizeof(arr3));     // 20

       printf("%d\n",sizeof(arr4));     // 6

0 0
原创粉丝点击