C++ 为什么用string定义的字符串总是16个字节?

来源:百度知道 编辑:UC知道 时间:2024/05/06 05:26:08
无论这个字符串有多长,或者只有一个字符,都是用sizeof()一看,总是16字节?什么原理?
谢谢!!!
colagump
你答非所问
p肯定是4个字节,在32位系统中。
动态分配了4096字节的空间...
可你的答案和我的问题有什么关系?
不理解!
我学了不到3个月,你应该给我个reasonable的答案...
顺便再问下,assign()函数怎么用?

char *p = new char[4096];

cout << sizeof(p);

delete [] p;

相信你能理解...

看来我高估你了, 我是高考前3个月自学的, 你连这些都没搞明白的话那就是你书选错了.

你说我答非所问?
我先声明你这个问题涉及到的不单单是sizeof(p)的问题, 因为你sizeof的是一个类, 这还将涉及到类和结构的内存对齐问题. 不过你能注意到这个细节上的问题说明你还是有一定的潜质.

至于string类, 它的容量是动态增长的, 所以其类的内部实现肯定有关于动态内存的操作, 这和数组的定义是不同的, 数组的大小是在编译期间就确定的, 而string类的大小是在程序运行期间动态确定的,你先看看这段代码:

#include <iostream>
using namespace std;

struct Test
{int* p;};

int main()
{
Test t;
cout << sizeof(t); // 32位机器上毫无疑问的4字节, 你我共识

t.p = new int[4096];
cout << sizeof(t); // 会变吗?

delete [] t.p;
}

再看string类的真面目, 打开string文件, 你可以看到这句:
typedef basic_string<char> string;
所以其只是basic_string对于char类型的一个typedef, 这样的话其内部的字符序列就肯定是用char* 类型指针来来操作的了, 毫无疑问sizeof(char*) == 4, 但是为什么sizeof(string) == 16呢, 这是因为string类中还有其他的数据成员, 比如记录字符长度的数据成员是一个32位的无符号整型, string::size()方法其实就是返回