我正在开发一个使用C++编写的大型服务器应用程序。这个服务器需要长时间运行而无需重新启动。由于我们的内存消耗随着时间的推移而增加,因此碎片化已经成为了一个疑点。到目前为止,我们的测量方法是比较私有字节和虚拟字节,并分析这两个数字之间的差异。
我的处理碎片化的一般方法是留待分析。对于其他类似整体性能和内存优化的问题,我也有同样的思考方式。你必须用分析和证明来支持变化。
我在代码审查或讨论期间注意到了很多关于内存碎片化的事情。似乎现在人们非常害怕它,很大程度上会提前采取“预防碎片化”的措施。他们要求进行代码更改,以减少或预防内存碎片化问题。但我对这些改变持不同意见,因为它们对我来说似乎是过早的优化。为了满足这些更改,我将牺牲代码的清洁度/可读性/可维护性等等。
例如,看下面的代码:
std::stringstream s;
s << "This" << "Is" << "a" << "string";
在这里,stringstream所做的分配数量是未定义的,可能会有4个分配,也可能只有1个分配。因此,我们不能仅根据此进行优化,但一般共识是要么使用固定缓冲区,要么以某种方式修改代码以潜在地减少分配。我不认为stringstream在这里自己扩展会对内存问题产生很大影响,但也许我错了。
对上面的代码的一般改进建议如下:
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
现在有一个巨大的推动力量,尽可能地使用堆栈而不是堆。
这种方式能否预防内存碎片化,还是只是一种虚假的安全感?