sizeof

来源:互联网 发布:c语言的strtok 编辑:程序博客网 时间:2024/06/06 03:06

前两天在和同学交流的时候讨论到了sizeof和strlen的用法,自己也不是太清楚,于是就查了书和相关博客,得到的总结如下:

strlen是c++库函数中的求字符串长度的函数,而sizeof则是操作符。

我首先遇到的问题是字符数组或者字符串常量的问题

字符数组或者字符串常量在存储时,在最后都有一个'\0'

所以strlen("1234")与sizeof("1234")是不同的。但是在string类的存储中并没有存储这个‘\0’

经过查询资料发现strlen就是用来计算字符串长度的,而sizeof却有很大学问(相对来说),sizeof是用户来计算所占内存空间的。

sizeof主要可分为以下几类:

1.对常见内置类型求sizeof,等于该内置类型实际所占字节数。

比如:sizeof(int)= 4,sizeof(double)= 8

2.对于数组,sizeof获得的是数组的所占空间的大小,也就是数组的长度乘以数组元素的sizeof

例如:

int t[10];则sizeof(t) = 4*10 = 40

所以经常可以看到用来求解数组的长度   length = sizeof(t)/sizeof(int)

3.对于指针

char *p = new char[10];

sizeof(p) = 4;

sizeof(*p) = 1;

因为指针存放的是地址,所以不论是什么类型,对指针求sizeof都是4

而对指针解引用后计算结果则指针所指类型的大小

4.对于字符串得到是长度加1

例如:

sizeof("1234")= 5

5.最后也是最难理解的,就是对结构体联合体及类类型的求解

这里面涉及到一个数据的对齐,其目的是为了提高计算效率(我记得是)

具体的求解有以下三个原则:

1.第一个数据类型从内存开始处存放,之后的每个类型存放时,要满足所存放的开始地址为该类型大小整数倍

2.对于内嵌结构体类型,对其拆解来看,以最大的为准。

3.最后整个结构体类型的大小应该为最大的数据类型大小的整数倍

可能看上去不是很好理解,下面一些例子就很具有代表性(我很笨,看了好多遍才看懂)

1、struct s1//满足第一条

{

char c1;   

int c2;

double c3;

//...构造函数省略,以下相同

};

那么c1就是从相对于其始地址0开始存放,1,2,3为系统自动填充

       c2是从4处开始,

       c3从8处开始

s1 t;

sizeof(t) = 4+4+8 = 16

2.struct s2//满足第二条

{

  char a1;//0

   s2   a2;//8..........24

}

s2 t;

sizeof(t) = 24

3.struct s3

{

double d1;//0........7

char d2;//8

}

s3 t;

sizeof(t) = 8 + 8 =16


当然一般情况上面三种情况是适应的(在vs下面vc 6下)

我们是可以对对齐方式进行调整的,使用#pragma pack( n ),如果这个值比结构体成员的sizeof值小,

那么该成员的偏移量应该以此值为准。例如当:

#pragma pack参数为1时,就不进行对齐。在vs和vc  6.0下默认是8

在linux的编译器下默认为4.

。。。

今天的看博客收获还是蛮大的,欢迎批评指正












0 0
原创粉丝点击