在vector <string> </string>中优化不必要的字符串复制

时间:2011-09-28 04:54:35

标签: c++ optimization vector dynamic-allocation

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

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复制构建它。 Demo

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

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

3 个答案:

答案 0 :(得分:3)

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

否则你可能会尝试这样的事情:

obj.v.resize(obj.v.size()+1);
obj.v.back().swap(string(buffer));

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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