时间:2021-05-19
在C语言中,有两种方式表示字符串:
两种形式总是以\0作为结束标志。
C++ string 与它们在C语言中的前身截然不同。首先,也是最重要的不同点,C++ string 隐藏了它所包含的字符序列的物理表示。程序设计人员不必关心数组的维数或\0方面的问题。
string 在内部封装了与内存和容量有关的信息。具体地说,C++ string 对象知道自己在内存中的开始位置、包含的字符序列以及字符序列长度;当内存空间不足时,string 还会自动调整,让内存空间增长到足以容纳下所有字符序列的大小。
C++ string 的这种做法,极大地减少了C语言编程中三种最常见且最具破坏性的错误:
C++ 标准没有定义 string 类的内存布局,各个编译器厂商可以提供不同的实现,但必须保证 string 的行为一致。采用这种做法是为了获得足够的灵活性。
特別是,C++ 标准没有定义在哪种确切的情况下应该为 string 对象分配内存空间来存储字符序列。string 内存分配规则明确规定:允许但不要求以引用计数(reference counting)的方式实现。但无论是否采用引用计数,其语义都必须一致。
C++ 的这种做法和C语言不同,在C语言中,每个字符型数组都占据各自的物理存储区。在 C++ 中,独立的几个 string 对象可以占据也可以不占据各自特定的物理存储区,但是,如果采用引用计数避免了保存同一数据的拷贝副本,那么各个独立的对象(在处理上)必须看起来并表现得就像独占地拥有各自的存储区一样。例如:
// #include<bits/stdc++.h>#include <iostream>#include <string>using namespace std; int main() { string s1("12345"); string s2 = s1; cout << (s1 == s2) << endl; s1[0] = '6'; cout << "s1 = " << s1 << endl; // 62345 cout << "s2 = " << s2 << endl; // 12345 cout << (s1 == s2) << endl; return 0;}在 GCC 下的运行结果:
1
s1 = 62345
s2 = 12345
0
只有当字符串被修改的时候才创建各自的拷贝,这种实现方式称为写时复制(copy-on-write)策略。当字符串只是作为值参数(value parameter)或在其他只读情形下使用,这种方法能够节省时间和空间。
不论一个库的实现是不是采用引用计数,它对 string 类的使用者来说都应该是透明的。遗憾的是,情况并不总是这样。在多线程程序中,几乎不可能安全地使用引用计数来实现。
到此这篇关于C++ string的内部究竟是什么样的的文章就介绍到这了,更多相关C++ string内部是什么内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
很多人很好奇淘宝客究竟是做什么的,好像这个词语经常会被提到,尤其是淘宝购物过程中。那么淘宝客究竟是什么呢,加入淘宝客有什么门槛呢,让我们一探究竟。淘宝客是什么意
一、C++头文件究竟是什么,你怎么看?每个C++/C程序通常分为两个文件。一个文件用于保存程序的声明(declaration),称为头文件。另一个文件用于保存程
最近很多的新手淘宝买家都在询问,这个3c认证究竟是什么意思呢?什么样的店家才需要去做3C认真呢?下面一起通过文章来进行详细了解吧。先来简单的介绍一下3C认真的概
优秀的文字设计有很多,那么优秀的网站设计究竟是什么样的呢?1,多鼓励用户的操作每个网站制作出初衷,说到底就是为了鼓励用户去点击,去操作,操作可以包括很多内容,注
优秀的文字设计有很多,那么优秀的网站设计究竟是什么样的呢?1,多鼓励用户的操作每个网站制作出初衷,说到底就是为了鼓励用户去点击,去操作,操作可以包括很多内容,注