声明一个 string S = “xiantao”
求string S 中字符的个数:(C++中类Sting提供了一些字符串的基本操作,其中length()就返回了字符串的字符个数)
cout << "the char_number of S" <<S.length() << endl;//返回7
求S(也就是S本身,它是一个引用) 在内存所占大小(单位:Byte):
cout << "sizeof sting S" <<sizeof(S) << endl; // 返回28
为什么会是这样呢?对比看一下这个输出
cout << "sizeof sting_type " <<sizeof(string) << endl; // 返回28
其实他俩所占的大小是一样的,S是一个string类型的引用,它本身也占有一定的内存。这个内存大小是固定的一班由编译器决定。
求一个char char_a = 'T'所占内存大小。
cout << "sizeof char" <<sizeof(char) << endl;//等于下面的
cout << "sizeof char_a" <<sizeof(char_a) << endl;//输出是 1
同样在string中每个字符占内存大小也是char类型的大小。
那么怎么求出一个string S在内存中的大小呢。应用以上的sizeof用法就能知道:space of string S:sizeof(char) * (S.length()+1)
这里面为什么是(S.length()+1)个呢?其实由于string 类型需要一个结束符来当标志。最后一个结束符就是NULL,在这里就把他当做是string的地址空间。
这里插入一点关于string的最后一个结束标志它打印出来的是个空字符。
求出S的首地址char *address_first = &S[0];很明显address_first 是一个char类型的指针。
cout << *(address_first+7) << "***" << endl;
输出结果是“@***” //这里用@代替空格。
为了避免造成误解,还要找个对比看一下
cout <<*(address_first+8)<< "****" << endl;
结果输出了一个乱码和***。
sizeof一些基本类型的大小:sizeof(type) 在64位机器上编译结果如下
sizeof (unsigned int) = sizeof (int) = sizeof(long)=4;
sizeof (long long) = 8;
sizeof (float) = 4;
sizeof(double) = 8;
sizeof(bool) = 1;
sizeof(char) = 1;
sizeof下求解一些数组(array),结构体(struct),联合体(union)
声明个数组 int arr[6]
一个结构体:
struct Stru{
int a;
char b;
long long c;
};
有这个函数 void function(int arry[]){
cout << sizeof(arr) << endl;
}
关于数组应该注意的:
求数组的length。sizeof(arr) / sizeof(int);
但是如果这样吧一个数组当做实参传递给一个函数,在函数中又会发生什么呢?
如上面的函数,运行之,能得到一个int 类型指针的大小:4 Byte。为什么?在传递数组时,其实只是把指针传递给了函数当做实参,不是整个 数组。而所有指针类型求sizeof都是4字节。
关于结构体要注意的:
求结构体Stru的sizeof(Stru)是16=(4 + 4 + 8)Byte。
为什么上面计算的Stru中吧char类型成员看成4呢?之前在一个博客里看见 为了字节对齐。计算机一次可以32位进行计算。所以吧char类型和int 类型对齐进行计算。
关于更多sizeof特殊任性用法看这里。