已解决问题 - 浏览139次

下一个已解决问题
hackztxhackztx

伴读书童

string可以存储多少字节??? 有资料不??

还可输入300个字

请输入上图中的验证码,字母不区分大小写。

点击查看更多 字节 string 可以 相关信息

hnlhnl

圣贤

最佳答案 - 由投票者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);

0 0

还可输入300个字

请输入上图中的验证码,字母不区分大小写。

其他回答(3)

  • xy745@yahoo.xy745@yahoo.

    尚书

    根据电脑内存

    还可输入300个字

    请输入上图中的验证码,字母不区分大小写。

  • 勇敢的心GG勇敢的心GG

    高级书童

    String在理论上说是没有字节限制的,你机器内存有多大,就可以存储多少字节。不过针对不同的编程语言,String代表了不同的概念。

    给你两个参考的资料。

    c++的String详解:
    http://read.newbooks.com.cn/info/119627.html


    JAVA的String详解:
    http://www.builder.com.cn/2007/0903/486176.shtml

    还可输入300个字

    请输入上图中的验证码,字母不区分大小写。

  • yzsqqcyzsqqc

    勤学秀才

    Visual Basic 中,string分两种类型,即“定长字符串类型”和“变长字符串类型”,其中 定长字符串类型 储存范围:1~65535个字符,变长字符串类型储存范围:0~约20亿字符

    还可输入300个字

    请输入上图中的验证码,字母不区分大小写。

返回知识堂首页>>

猜你喜欢看

更多
1