前两天在和同学交流的时候讨论到了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.
。。。
今天的看博客收获还是蛮大的,欢迎批评指正