【发布时间】:2014-06-25 03:03:33
【问题描述】:
在 C++ 标准中std:string 遵循指数增长策略,因此我认为在连接期间字符串的capacity() 将在必要时始终增加。但是,当我测试test.cpp 时,我发现在for 循环中,只有每两次,capacity() 在赋值过程中才会缩回到length()。
为什么这种行为不取决于字符串的长度,而是取决于我更改字符串的频率?是不是某种优化?
以下代码用g++ -std=c++11测试。
测试.cpp:
#include <iostream>
int main(int argc, char **argv) {
std::string s = "";
for (int i = 1; i <= 1000; i++) {
//s += "*";
s = s + "*";
std::cout << s.length() << " " << s.capacity() << std::endl;
}
return 0;
}
输出将是这样的:
1 1
2 2
3 4
4 4
5 8
6 6 // why is capacity shrunk?
7 12
8 8 // and again?
9 16
10 10 // and again?
11 20
12 12 // and again?
13 24
14 14 // and again?
15 28
16 16 // and again?
17 32
...
996 996
997 1992
998 998 // and again?
999 1996
1000 1000 // and again?
【问题讨论】:
-
现在我想我不明白你的问题。是“为什么复制分配会减少容量?”如果是这样,答案不是很明显吗?
-
@DavidSchwartz 我以前不知道这一点,但 abarnert 告诉我们“当从一个字符串复制分配到另一个字符串时,没有理由复制容量”?我的问题是,复制分配并不总是减少容量,而是每两次才这样做。
-
您可以简单地查看您的编译器实现
std::string的源代码,看看它为什么会这样做。