strlen与sizeof
strlen
是一个函数,运行时才能计算。
声明:
size_t strlen(const char *string);
说明:
(1) 操作对象只能是char*,当然相应的数组char[]也行;
(2) strlen返回的是字符串大小,从开始到第一个' '为止,不包含' '。
例:
char *str0 = "Hello!";
cout << strlen(str0)<<endl; //输出6
cout << sizeof(str0)<<endl; //win32平台,输出4,具体看sizeof说明
char str1[20] = {'H', 'e', 'l', 'l', 'o', '!' };
cout << strlen(str1)<<endl; //输出6
cout << sizeof(str0)<<endl; //输出20,数组分【配空间大小
char str2[20] = {0, 'H', 'e', 'l', 'l', 'o', '!' };
cout << strlen(str2)<<endl; //输出0, 因为第一个字符就终止了
sizeof
判断一个对象或者类型所占的内存字节数的操作符,在编译时就已经计算好了。
说明:
(1) 操作对象为基本类型,则值为基本类型占用空间大小;
(2) 操作对象为对象,则值为对象占用空间大小;
(3) 操作对象为数组,则值为数组分配的空间大小;
(4) 操作对象为指针,则值为指针本身大小;
如程序为win32位平台,则指针均为4个字节,如程序为x64平台,则指针均为8个字节。
(5) 操作对象为结构体,则要求满足字节对齐原则。
补充 —— 字节对齐原则
主要包括三个准则:
(1) 每个成员起始位置相对于结构体起始位置偏移量必须为该成员大小的整数倍;
(2) 对于结构体中的结构体成员(如结构体A为结构体B的成员),则成员结构体A其相对于起始位置偏移量必须为机构体A中最宽成员整数倍(可联系(3)进行理解);
(3) 结构体总大小必须为结构体中最宽成员的整数倍。
总结:补不补,看后面;总长度看最宽。
例:
struct A
{
int a; //4
short b; //2, 后面补2(因为下一个是int类型,起始位置必须是4的整数倍,而4+2不是4的整数倍)
int c; //4
char d; //1,补3(整个结构体长度为最宽元素int的整数倍)
};
struct B
{
int a; //4
short b; //2
char c; //1,补1(下一个成员是int型,宽度为4,4+2+1不,4的整数倍)
int d; //4
};
故结构体A宽度为16个字节,而结构体B为12个字节。可以看出,由于字节对齐原则,在定义结构体时合理的成员顺序有助于减少内存消耗。