最佳答案 - 由投票者2008-07-29 16:02:03选出
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);
其他回答(3)
-
根据电脑内存
-
String在理论上说是没有字节限制的,你机器内存有多大,就可以存储多少字节。不过针对不同的编程语言,String代表了不同的概念。
给你两个参考的资料。
c++的String详解:
http://read.newbooks.com.cn/info/119627.html
JAVA的String详解:
http://www.builder.com.cn/2007/0903/486176.shtml -
Visual Basic 中,string分两种类型,即“定长字符串类型”和“变长字符串类型”,其中 定长字符串类型 储存范围:1~65535个字符,变长字符串类型储存范围:0~约20亿字符

hackztx

hnl
xy745@yahoo.






