sizeof函数返回时所占的字节个数。同一段代码在32位机器和64位机器上的sizeof返回值可能不同。代码如下
#include"stdio.h"
struct{}str;
struct{int a;}str1;
void main(int argc,char *argv)
{
char *string="";
char *s="1",*s1="123456789012345",a[3]="1";
int i,j1,j,k,k1,k2;
i=sizeof(string);
j=sizeof(s);
j1=sizeof(s1);
k=sizeof(a);
k1=sizeof(str);
k2=sizeof(str1);
printf("%d %d %d %d %d %d\n",i,j,j1,k,k1,k2);
}
在32位机器和64位机器的运行结果如截图。注意该结果是gcc 编译c的规则的结果
有如下几点总结:
1.在gcc编译器下编译c,struct中间是空,则sizeof返回0。这点与下面g++编译器对比
2.char *s="124342";sizeof(s);大小与s中的内容多少无关系。都是分配了一个固定大小,即指针所占的字节数。
再看下面代码:gcc编译
#include"stdio.h"
struct{}str1;
struct{int a;}str2;
int main(int argc,char *argv)
{
char *s1="";
char *s2="1",*s3="123456789012345",s4[3]="1",s5[]="123456789";
int i,i1,j1,j2,j3,j4,j5,j,k,k1,k2,k3;
i=sizeof(s1);
j=sizeof(s2);
j1=sizeof(s3);
k=sizeof(s4);
k3=sizeof(s5);//
k1=sizeof(str1);
k2=sizeof(str2);
i1=sizeof(*s1);//s1为char * 类型,*s1其实就是去其指向的char,故sizeof=1,一个字节
j2=sizeof(*s2);
j3=sizeof(*s3);
j4=sizeof(*s4);
j5=sizeof(*s5);//s5为指向"123456789"中的1的指针,故sizeof结果为1字节
printf("s1=%d s2=%d s3=%d s4=%d s5=%d str1=%d str2=%d\n",i,j,j1,k,k3,k1,k2);
printf("s_1=%d s_2=%d s_3=%d s_4=%d s_5=%d\n",i1,j2,j3,j4,j5);
return 1;
}
运行结果如下。
我们可以看出结果在注释中
再看如下一段cpp代码:该段代码g++编译cpp类型
#include"stdio.h"
#include <iostream>
using namespace std;
struct circle0
{
}cir0;
struct circle1
{
int radius;
}cir1;
struct circle2
{
int radius;
circle2() {radius=1.0;}
}cir2;
struct circle3
{
int radius;
circle3() {radius=1.0;}
~circle3(){radius=0;}
}cir3;
struct circle4
{
int radius;
circle4() {radius=1.0;}
virtual ~circle4(){radius=0;}
}cir4;
struct circle5
{
int radius;
circle5() {radius=1.0;}
virtual void f1(){cout<<"f1()\n";}
virtual ~circle5(){radius=0;}
}cir5;
struct circle6
{
int radius;
circle6() {radius=1.0;}
virtual void f1(){cout<<"f1()\n";}
virtual ~circle6(){radius=0;}
void f2() {cout<<"f2()\n";}
}cir6;
int main()
{
int c0,c1,c2,c3,c4,c5,c6,c_0,c_1,c_2,c_3,c_4,c_5,c_6;
c0=sizeof(cir0);
c1=sizeof(cir1);
c2=sizeof(cir2);
c3=sizeof(cir3);
c4=sizeof(cir4);
c5=sizeof(cir5);
c6=sizeof(cir6);
c_0=sizeof(circle0);
c_1=sizeof(circle1);
c_2=sizeof(circle2);
c_3=sizeof(circle3);
c_4=sizeof(circle4);
c_5=sizeof(circle5);
c_6=sizeof(circle6);
printf("c0:%d c1:%d c2:%d c3:%d c4:%d c5:%d c6:%d\n",c0,c1,c2,c3,c4,c5,c5);
printf("c_0:%d c_1:%d c_2:%d c_3:%d c_4:%d c_5:%d c_6:%d\n",c_0,c_1,c_2,c_3,c_4,c_5,c_6);
return 1;
}
运行结果
我们可以得出如下结论
1.c编译时struct的结构如果为空,则sizeof(struct)结果为0;而c++编译则不然,结果为1
2.构造函数、析构函数、非virtual函数不占struct的空间,因为调用函数只需要知道函数的地址,而函数的地址只与类型有关,而与类型的实例无关,编译器不会因为函数而在实例中添加额外信息
3.struct中若有virtual声明的函数,则多一个指针类型的空间。因为若有虚函数,则会为该类型添加一个虚类型的表,该实例就会有一个指向虚类型的指针。故多一个指针的空间。故一个virtual函数和两个virtual函数实际上都只是多一个指针类型。