– 一,sizeof() 的一些常见使用
char* s1="0123456789";
char s2[]="0123456789";
char s3[100]="0123456789";
int s4[100];
char q1[]="abc";
char q2[]="a\n";
char* q3="a\n";
char *str1=(char *)malloc(100);
void *str2=(void*)malloc(100);
-
如上,我们使用sizeof()。结果为多少呢
s1 是一个字符指针,指针的大小是一个定值,就是四个字节。所以 sizeof(s1)是4字节。
s2 是一个字符数组,这个数组最初未定大小,由填充决定,共有10个字符+”\0″ 一共11个字节。
s3 也是
一个
字符数组,这个数组预分配100,所以他的大小一共是100字节。
s4 是
一个整形
数组,这个数组预分配100,但每个整形变量所占空间是4,所以大小为400字节。
q1类似于s2,大小为4字节。
q2类似于s2,一个\n算作一位,所以大小为3字节。
q3同s1,为字符指针,大小为4字节。
str1,str2 同样为字符指针,大小为4字节。
二,sizeof()中的结构体
-
一些结构体
struct{
short a1;
short a2;
short a3;
}A;struct{
long a1;
short a2;
}B;
A和B是两个结构体
结构体A中有三个short类型变量,各自以2字节对齐,则a1,a2,a3都取2字节对齐,sizeof(A)为6,其也是2的整数倍。
B中a1为4字节对齐,a2为2字节对齐,结构体默认对齐参数为8,则a1取4字节对齐,a2取2字节对齐;结构体大小为6字节,6不为4的倍数,补空字节,增到8,符合所有条件,则sizeof(B)为8.
在默认情况下,为了方便对结构体内元素的访问和管理,当结构体内的元素的长度都小于处理器的位数的时候,便以结构里面
最长的数据元素为对齐单位
,也就是说,
结构体的长度一定是结构体里面最长数据元素的整数倍
。
如果结构体内存在长度大于处理器位数的元素,那么就以处理器的位数为对齐单位。但是结构体内存类型相同的连续元素和数组一样,将在连续空间内。
三,sizeof()中的类
以下代码为32位机器编译,数据是以4字节为对齐单位,这两个类的输出结果为什么不同?
class B{
private:
bool m_bTemp;
int m_nTemp;
bool m_bTemp2;
};
class C{
private:
int m_nTemp;
bool m_bTemp;
bool m_bTemp2;
};
cout << sizeof(B) << endl; //12
cout << sizeof(C) <<endl; //8
第一种类的数据对齐是下面的情况:
|bool|—-|—-|—-|
|———int——–|
|bool|—-|—-|—-|
所以大小为3
4=12字节
第二种类的数据对齐是下面的情况:
|———int——–|
|bool|bool|—-|—-|
所以大小为2
4=8字节
四,sizeof() 和strlen() 之间的区别
-
sizeof: 分配的数组实际所占的内存空间大小。无关里面的存储内容。
strlen:计算字符串的长度,以’\0’为字符串结束标志。 - sizeof是运算符,strlen是函数。
- sizeof可以用类型做参数。strlen只能用char *做参数,且必须是以’\0’结尾的。
- sizeof在编译过程中就计算了,strlen在运行的时候才计算出来