2013-09-25 69 views
3

我在C++中有这个片段。C++字符串中的“大小”和“容量”之间的区别?

#include <iostream> 
#include <string> 

int main() 
{ 
string bigNews("I saw Elvis in a UFO. "); 
cout << bigNews << endl; 
bigNews.insert(0, " thought I "); 
cout << bigNews << endl; 
cout << "Size = " << bigNews.size() << endl; 
cout << "Capacity = " 
<< bigNews.capacity() << endl; 
bigNews.append("I've been working too hard."); 
cout << bigNews << endl; 
cout << "Size = " << bigNews.size() << endl; 
cout << "Capacity = " 
<< bigNews.capacity() << endl; 
    return 0; 
} 

而且我得到的输出如下图所示:

I saw Elvis in a UFO. 
thought I I saw Elvis in a UFO. 
Size = 33 
Capacity = 44 
thought I I saw Elvis in a UFO. I've been working too hard. 
Size = 60 
Capacity = 88 

我可以计算出尺寸增大的原因,但我不能够做出来怎么容量增大?

我知道的是容量是字符串缓冲区,我们可以推送,但如何分配空间?

+0

只要满足该类的复杂性要求,就不能保证以任何特定方式进行分配。 – chris

回答

7

capacity是字符串当前可以容纳的最大字符数,而不必增长。 size是字符串中实际存在多少个字符。他们分离概念的原因是分配内存通常效率低下,因此您尝试通过获取比实际需要的内存更少的内存来分配内存。 (许多数据结构使用一个“倍增”的方法在哪里,如果他们打他们的N能力,并需要更多的空间,他们将分配2*N空间,以避免再次任何时间很快重新分配。)

capacity会自动增加为您使用该字符串并需要更多空间。您也可以使用reserve函数手动增加它。

3

documentation

capacity()

返回一个可以在当前分配的存储 (公共成员函数)

所以举行的字符数,它是分配内部缓冲区的大小。你看到的是当它耗尽时它的大小加倍 - 这是一种常用的技术,可以有效地使用动态大小的缓冲区,这就是所谓的“指数存储扩展”。是什么把它归结为基本上是这样的:

void resize_buffer(char **buf, size_t *cap, size_t newsize) 
{ 
    while (newsize > *cap) 
     *cap *= 2; 

    *buf = realloc(*buf, *cap); 
} 

(当然,这大大简化,不使用此在生产实际重新分配代码)可能是你的std::string实现使用这一招,这就是为什么你会看到缓冲区大小增加了100%。

+0

对于'realloc'的不安全使用,这值得-1。请修复它。 – DanielKO

+4

@DanielKO你不能认真对待我不知道这一点。显然,这只是为了演示目的,而不是为了实际实施。如果我按照原样“修复”了所有错误,它会要求我重新实现一个完整的缓冲区重新分配函数,这个函数很难(realloc()的正确用法并不是唯一的问题), 2.它会完全失去它的目的,即它应该是可读的,以便向OP解释发生了什么。所以不,我没有解决它。 – 2013-09-25 05:15:10

相关问题