一个string字符串占多少内存空间?

seabc 2003-02-15 05:24:13
比如:
string abc="This is sample."

char abc[]="This is sample."

是不是占用的空间一样大?
...全文
3672 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
waterain 2003-03-19
  • 打赏
  • 举报
回复
mark 先
xdspower 2003-03-19
  • 打赏
  • 举报
回复
string的长度应该在string结构中有专门的受保护字段区域来记录(这样就可以使得字符串长度不以\0结束,但它的使用必须经过专门的函数来读取,改写操作要用其他一些函数了,比如拷贝,重载的+等等),
braveheart2000 2003-03-19
  • 打赏
  • 举报
回复
肯定是string大,因为sizeof(string)=16, sting a;sizeof(a)=16,sting b="abc" sizeof(b)=16,也就是说,声明一个string类的实例时系统自动为其分配了16位的内存大小,如果存放了大余16个的字符,我认为系统应该会再分配缓冲区来存储字符的,在16位里面肯定有缓冲区的地址保存在里面
jieshen 2003-02-18
  • 打赏
  • 举报
回复
好象是string大
tohigh 2003-02-18
  • 打赏
  • 举报
回复
string大
string abc="This is sample."
abc是string类的一个实例
它包含两个数据成员:int _size; char *_string;
因为存在成员函数abc.size();//返回15,int _size
和abc.c_str(); //返回"This is sample."的首地址,char *_string
sevencat 2003-02-18
  • 打赏
  • 举报
回复
http://www.cse.fau.edu/~cot3002l/stringsC++/
这是另外一个基本介绍的站点
sevencat 2003-02-18
  • 打赏
  • 举报
回复
STRING还能实现写时复制等高级功能。
再贴STRING的一些其他东西成员(好像应该全是私有了,因为应该对用户透明的)
private:
// Data Members (private):
mutable _Alloc_hider _M_dataplus;

// The following storage is init'd to 0 by the linker, resulting
// (carefully) in an empty string with one reference.
static size_type _S_empty_rep_storage[(sizeof(_Rep) + sizeof(_CharT) + sizeof(size_type) - 1)/sizeof(size_type)];

_CharT*
_M_data() const
{ return _M_dataplus._M_p; }

_CharT*
_M_data(_CharT* __p)
{ return (_M_dataplus._M_p = __p); }

_Rep*
_M_rep() const
{ return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }

/////////////////////////////////////////
_Atomic_word _M_references;

bool
_M_is_leaked() const
{ return _M_references < 0; }

bool
_M_is_shared() const
{ return _M_references > 0; }

void
_M_set_leaked()
{ _M_references = -1; }

void
_M_set_sharable()
{ _M_references = 0; }

_CharT*
_M_refdata() throw()
{ return reinterpret_cast<_CharT*>(this + 1); }

_CharT&
operator[](size_t __s) throw()
{ return _M_refdata() [__s]; }

_CharT*
_M_grab(const _Alloc& __alloc1, const _Alloc& __alloc2)
{
return (!_M_is_leaked() && __alloc1 == __alloc2)
? _M_refcopy() : _M_clone(__alloc1);
}

这两个私有成员应该是最重要的两个私有成员了。
一个是保存他的状态,
一个是实际的应用。

sevencat 2003-02-18
  • 打赏
  • 举报
回复
这个是GCC里面STRING的实现介绍
1. String really contains _M_length + 1 characters; last is set to 0 only on call to c_str(). We avoid instantiating _CharT() where the interface does not require it.
2. _M_capacity >= _M_length
Allocated memory is always _M_capacity + (1 * sizeof(_CharT)).
3.string是个对象,因此已经对length做了重载。
public:
// Capacity:
size_type
size() const { return _M_rep()->_M_length; }

size_type
length() const { return _M_rep()->_M_length; }

size_type
max_size() const { return _Rep::_S_max_size; }
我想应该能解释一些问题了。
grrrrrr 2003-02-18
  • 打赏
  • 举报
回复
char abc[]="fghgfhfhf";
abc="fdgfdgdfgfggfdggfdgfgdf';

符值后,abc本身大小并没有变化
但是符值过程另外分配了一块新空间以保存字符串,这块空间大小会变化
sevencat 2003-02-18
  • 打赏
  • 举报
回复
不知道basic_string到底是怎么实现的,有没有哪位大哥贴个关于basic_string的简单实现原理?
王国凡 2003-02-18
  • 打赏
  • 举报
回复
'\0' 字符很特别, 我想如果你在调试时看不到的, 并不能证明内存中就没有 '\0' 结束符, C++ 语言的创始人 Stroustrup, Bjarne, 在他的 The C++ Programming Language 一书的 5.2.2 节中有这样的话:
A string literal contains one more character than it appears to have; it is terminated by the null character '\0', with the value 0. For example:
sizeof("Bohr") == 5
The type of a string literal is "array of the appropriate number of const characters," so "Bohr" is of type const char[5].
不知道有没中文的译本, 但我想大家因该都看得懂, 如果你没有他的英文书我可以把包含这句话的第五章(ch5.pdf)文档 email 给你, 这里就不写程序证明了.
sevencat 2003-02-18
  • 打赏
  • 举报
回复
STRINGR 的未位估计是由一个指针决定的,因此STRING里面可能可以有0x00,我想
王国凡 2003-02-16
  • 打赏
  • 举报
回复
试一下不就知道了, MSDN 上说:A type that describes a specialization of the template class basic_string with elements of type char as a string.
所以我想 string 是特殊化的 char, 其内置类型是 char,MSDN上也给了个例子,不好意思,这里借用一下了,哈哈...
#include <iostream>
#include <string>

using namespace std;

void main()
{
string a="This is sample.";
char b[]="This is sample.";
if(a == b)
cout << "a and b are equal" << endl;
else
cout << "a and b are not equal" << endl;
}

Output:
a and b are equal
所以呢,是相等的。
我用size()或者length()也试了一下显示的长度都是15
fastzch 2003-02-16
  • 打赏
  • 举报
回复
我觉得应该还包括字符串名所占的用来存储地址的空间吧!
还有,C语言里面好像不支持你写的那种形式吧!
guxiaobo1982 2003-02-16
  • 打赏
  • 举报
回复
就事论事而言,比如string a="This is sample."与char b[]="This is sample.",变量a和变量b,b是内部数据类型,a虽然是标准类,但它还是类,它有自己的对象内存,以及堆内容的内存,所以它们的内存大小是不同的
晨曦2003 2003-02-16
  • 打赏
  • 举报
回复
up
wzhnet 2003-02-16
  • 打赏
  • 举报
回复
To ; sgnaw(小凡)
我是初学者 对这方面不大了解 还请多指教

关于 string 和 c 风格字符串
在 C++程序设计中 作者说 string 类型 不已 0字符 判断结束
例如 string s="abc"
在监视窗口里 看到 s 有 a b c 三个字符组成 没有 0这位
也就是说 在 对s 做下标操作时 只能是 s[0]-s[2]

而 c 风格字符串 用 0 做结束标志
例如 char p[]="abc";
在监视窗口里 看到 p 有 a b c 0 四个字符组成
也就是说 在 对p 做下标操作时 是 p[0]-p[3]

至于 所谓的长度 至少 string中是不算 0 的 s.length()是 3
不过 上次说了
在 字符串实际的地址中 最后一位 还是个 0 我不知是怎么回事
可能是对c的支持?
sevencat 2003-02-16
  • 打赏
  • 举报
回复
比较老的C++里面STRING存放和CHAR的存放很不同的。
string是由一个strstreambuf来维持的。有谁知道标准函数库里面STRING的实现方法吗?
王国凡 2003-02-16
  • 打赏
  • 举报
回复
当然知道 string 会根据实际情况动态分配, 可是楼主的问题是:
string abc="This is sample."与char abc[]="This is sample."是不是占用的空间一样大?也就是说一旦具体的给 string 分配了一个字符串时("This is sample.")它所占的空间,对吧?如果仅论 string 类占多少空间或者 char 类占多少空间, 显然要看 OS/Compiler 具体而定了.另外,也没说 efanl 没道理, string s = "abc" 长度当然是4(算上最后一个结束符),我想他只是少写了一句: char s2[] = "abc" 的长度也是 4
ddmpqcw 2003-02-16
  • 打赏
  • 举报
回复
string大!
加载更多回复(13)
课程目标:学习Java语言中字符串相关的知识、字符编码常识和正则表达式的使用,并完成案例前导课程:《Java工程师必学系列课程》前4部课程内容:本课程是《Java工程师必学系列课程》的第5部分,主要讲解Java语言中字符串相关知识、字符编码常识和正则表达式的使用。本课程涉及的主要内容可以分为四部分:一、StringStringBuffer和StringBuilder类基本常识、基本原理和使用技巧二、字符编码常识三、Java语言正则表达式的详细语法和使用技巧四、实战案例课程说明:在开发Java程序的过程中,最常用的类莫过于字符串相关的类。可以毫不夸张的说,任何一个Java程序,都离不开对字符串保存和处理。很多学员对字符串的理解只是处于比较粗浅的阶段。殊不知,如果对字符串处理的不好,会影响到软件的运行效率。本课程专门讲解字符串相关的知识,将从字符串的存储方式、底层的运行方式等各方面深入讲解其中的原理和技巧。此外,对字符串进行更高级的处理,又要用到正则表达式的相关知识。正则表达式广泛应用于各种与字符串处理相关的场合。它是一套独立的语言系统,经过几十年的完善和发展,现在已经非常的强大,并且形成了国际标准。各种高级编程语言,都实现了自己的表达式引擎。本课程详细的讲解了Java语言中正则表达式的语法和使用技巧。掌握了正则表达式,对编程水平的提高有非常大的帮助!同时,本课程在最后一部分,安排了非常精彩的、完整的实战案例,通过实战的形式切实帮助学员提高解决具体问题的能力!预期效果:认真学习完本课程,学员可以掌握字符串处理及正则表达式相关的系统知识,并能提高实际的编码水平。环境配置要求:学习本课程需安装JDK1.8或更高版本的JDK,以便程序能正确运行,建议使用IntelliJ IDEA 2019.1.2或更高版本的开发工具。    因有合作协议约束,《穆哥学堂》只提供PDF版本的课件!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧