2

提供描述问题的最少代码:

struct A {
  vector<string> v;
  // ... other data and methods
};
A obj;
ifstream file("some_file.txt");
char buffer[BIG_SIZE];
while( <big loop> ) {
  file.getline(buffer, BIG_SIZE-1);
  // process buffer; which may change its size
  obj.v.push_back(buffer);  // <------- can be optimized ??
}
...

这里发生了2 次 string创建;第一次创建实际string对象,第二次为vector. 演示

push_back()操作发生了数百万次,而我多次支付额外的分配费用,这对我来说毫无用处。

有没有办法优化这个?我愿意接受任何合适的改变。(不将此归类为过早优化,因为push_back()在整个代码中发生了很多次)。

4

3 回答 3

3

你可以尝试几件事。第一个显然是在编译器上启用优化。 如果您可以将其声明为vector<const string>可能会有所帮助。

否则,您可能会尝试类似:

obj.v.resize(obj.v.size()+1);
obj.v.back().swap(string(buffer));
于 2011-09-28T04:58:43.527 回答
3

好吧,你得到了两个分配,但不是两个都属于字符串:其中一个创建字符串,而另一个只在向量内部创建一个指针(请注意,这取决于编译器:某些编译器/设置可能确实创建两个字符串,但大多数不会)。看看这个演示代码

优化它的一种方法是使用 char* 而不是字符串作为模板参数(不要忘记在杀死向量之前手动删除它!)。这样,您将摆脱一个(最大的)分配。或者,只需使用您自己的向量实现:您将能够控制内存分配的各个方面。

于 2011-09-28T05:05:46.110 回答
0

而不是在堆栈上有缓冲区 - 把它放到堆上。然后使用指针向量。只有一个

于 2011-09-28T05:10:39.363 回答