我在带有Linux操作系统的嵌入式系统上有一个配置文本文件。 要求是文件是文本,嵌入式系统具有 32兆的动态内存。该应用程序。将读取文件的代码用C ++编写。
可以使用这样的方法读取文件。
#include <string>
#include <fstream>
ifstream infile ("config_file_path");
if (infile.good())
{
string line;
// Set capacity to length of the longest line.
const unsigned char maxLen = 100;
line.reserve (maxLen);
while (std::getline (infile, line))
{
// Process the data in the line.
processData (line);
}
}
堆碎片会成为此实现的问题吗? 该文件最多可包含约150行文本。
答案 0 :(得分:1)
很难说你的应用程序是否因代码中的内存碎片而受损。 (你的代码可能会添加一些碎片,但我不知道它有多重要) 你可以尝试使用非标准的malloc库 - jemalloc nedmalloc tcmalloc 它们可能会为您提供更好的对象布局以及转储内存布局的能力
一般方法:
检查应用是否可以获得“内存不足”。压力测试可能有帮助。 检查你的应用程序有多少可用内存以及它是多么分散。 如果碎片是问题 - 请尝试以下方法: 堆喜欢LIFO原则(删除最后创建的块)。尝试将变量保留在堆栈上。使用专门的分配器。
如果你的功能:
为了最小化堆压力,您可以尝试将行读入堆栈缓冲区(例如使用fgets)
答案 1 :(得分:0)
堆碎片会成为此实现的问题吗?
在显示的示例中,我无法识别出表示堆碎片的行。
您正在使用std::string
对象,其内部机制通常被认为是不可预测的,即对象增长的大小以及何时释放内存,就是这样。
首先考虑std::string::capacity
以确保更紧凑的记忆。
第二步考虑提供custom allocators,一般免费商店(堆)的具体替代方案是: Pool 和 Stack 。
作为最后一步,请考虑使用较少抽象的代码,即指针,数组等,这是您更接近硬件时不可避免的解决方案。特别是当您使用对象提取输入并作为参数传递时,即不使用任何std::string
特定成员函数等。