我正在开发一个使用 C++ 编写的大型服务器应用程序。该服务器可能需要运行数月而不重新启动。碎片在这里已经是一个可疑的问题,因为我们的内存消耗会随着时间的推移而增加。到目前为止,测量一直是将私有字节与虚拟字节进行比较,并分析这两个数字的差异。
我对碎片化的一般方法是将其留给分析。我对一般性能和内存优化等其他事情有相同的思考方式。您必须通过分析和证明来支持更改。
在代码审查或讨论期间,我注意到很多,内存碎片是最先出现的事情之一。这几乎就像现在对它有巨大的恐惧,并且有一个提前“防止碎片化”的大举措。请求的代码更改似乎有利于减少或防止内存碎片问题。我倾向于立即不同意这些,因为它们对我来说似乎是过早的优化。我会牺牲代码的清洁度/可读性/可维护性/等等。为了满足这些变化。
例如,采用以下代码:
std::stringstream s;
s << "This" << "Is" << "a" << "string";
上面,字符串流在这里进行的分配数量是未定义的,它可能是 4 个分配,或者只是 1 个分配。所以我们不能仅基于此进行优化,但普遍的共识是要么使用固定缓冲区,要么以某种方式修改代码以可能使用更少的分配。我并没有真正看到 stringstream 在这里扩展自身是导致内存问题的巨大贡献者,但也许我错了。
对上述代码的一般改进建议如下:
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
还有一个巨大的推动力是尽可能使用堆而不是堆。
有没有可能以这种方式抢占内存碎片,或者这只是一种错误的安全感?