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

无论这个字符串有多长,或者只有一个字符,都是用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()方法其实就是返回这一成员的值了. 但4 + 4 == 8 != 16, 所以不排除有其他的数据成员的存在, 但还有一个要考虑的问题就是内存的对齐问题:

#include <iostream>
using namespace std;

#define GetSize(TypeName, msg)\
cout << "class "#TypeName" "#msg" -> " \
<< sizeof(TypeName) << " Bytes\n"

class A1
{int a;};

class A2
{int a; char b;};

#pragma pack(1)
class B1
{int a; char b;};

#pragma pack(2)
class B2
{int a; char b;};
#pragma pack()

class C1
{int a; void fun();};

class C2
{int a; virtual void fun();};

int main()
{
GetSize(A1, int a;); // 32位机器上毫无疑问的4字节, 你我共识
GetSize(A2, int a; char b;); // 会是5字节吗?
GetSize(B1, pack(1) int a; char b;);
GetSize(B2, pack(2) int a; char b;);
GetSize(C1, int a; + none virtual);
GetSize(C2, int a; + virtual);
}

仔细看看上面的代码, 如果你实在想搞清楚的话, 建议你看看Inside The C++ Object Model;

//colagump
//你答非所问

无知不是过...

//p肯定是4个字节,在32位系统中。
//动态分配了4096字节的空间...
//可你的答案和我的问题有什么关系?
//不理解!

没有关系的话就自己试图建立关系, 我已经给了你暗示, 剩下的就是从sizeof(指针)到sizeof(含指针的类、结构)的转变了, 不会?

//我学了不到3个月,你应该给我个reasonable的答案...
//顺便再问下,assign()函数怎么用?

不要拿自己是新手作为借口, 我从对C/C++一无所知到现在为止没有给任何人提过任何问题. 比起不懂就问, 我个人更提倡思而后问, 我在学习过程中所遇到的大部分问题都在各种资料和书籍中找到并通过自己的思考而获得感悟. 如果你能做到这点, 我相信你会获得远比来这里提问所获得的更多.
另外鄙视你的"reasonable", 这不是兼顾技术术语的原意而不做翻译地引入, 在我看来就是作秀!
assign()等库类库函数的使用, 推荐一本书《The C++ Standard Library》.

如果还有任何疑问, 请留言, 一定回复.
温馨提示:答案为网友推荐,仅供参考
相似回答