Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
区别于;“尺寸”;及;“容量”;在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; }_C++_String_Stl - Fatal编程技术网

区别于;“尺寸”;及;“容量”;在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; }

区别于;“尺寸”;及;“容量”;在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; },c++,string,stl,C++,String,Stl,我能理解为什么尺寸会增加,但我无法理解容量是如何增加的 我知道的是容量是我们可以推回的字符串缓冲区,但空间是如何分配的?容量是字符串当前可以容纳的最大字符数,而不必增加size是字符串中实际存在的字符数。它们是不同概念的原因是,分配内存通常效率低下,因此您试图通过一次获取比实际需要更多的内存来尽可能少地分配内存。(许多数据结构使用“倍增”方法,如果它们达到N的容量并需要更多空间,它们将分配2*N空间,以避免在不久的将来再次重新分配。) 容量将在您使用字符串并需要更多空间时自动增加。您也可以使用r

我能理解为什么尺寸会增加,但我无法理解容量是如何增加的


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

容量是字符串当前可以容纳的最大字符数,而不必增加
size
是字符串中实际存在的字符数。它们是不同概念的原因是,分配内存通常效率低下,因此您试图通过一次获取比实际需要更多的内存来尽可能少地分配内存。(许多数据结构使用“倍增”方法,如果它们达到
N
的容量并需要更多空间,它们将分配
2*N
空间,以避免在不久的将来再次重新分配。)

容量
将在您使用字符串并需要更多空间时自动增加。您也可以使用
reserve
功能手动增加它。

来自:

capacity()

返回当前分配的存储中可以保留的字符数 (公职人员职能)

因此,它是内部缓冲区的分配大小。您看到的是,当它耗尽时,它的大小会加倍——这是一种有效使用动态大小缓冲区的常用技术,称为“指数存储扩展”。归根结底是这样的:

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

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

(当然,这在很大程度上是简化的,不要将其用于生产中的实际重新分配代码。)可能您的
std::string
实现就是使用了这个技巧,这就是为什么您会看到缓冲区大小增加了100%。

只要满足类的复杂性要求,就不能保证以任何特定的方式分配。对于
realloc
的不安全使用,这应该得到-1。请把它修好。@DanielKO你不会真的认为我不知道的。显然,这只是为了演示,而不是为了实际实现。如果我按原样“修复”了所有的错误,它将是1。要求我重新实现一个很难实现的完整缓冲区重新分配功能(正确使用
realloc()
不是唯一的问题),以及2。它将完全失去它的目的,即它应该是可读的,以便它向OP解释发生了什么。因此,不,我没有修复它。
void resize_buffer(char **buf, size_t *cap, size_t newsize)
{
    while (newsize > *cap)
        *cap *= 2;

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