5
6
2014
0

sizeof函数

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函数实际上都只是多一个指针类型。

 

 


Category: 编程理解 | Tags: | Read Count: 518

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com