在嵌入式系统中读取文件的内存碎片



我在带有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 行文本要读取。

很难说你的应用是否受到代码内存碎片的影响。(您的代码可能会添加一些碎片,但我不知道它有多重要( 您可以尝试使用非标准的 malloc 库 - 杰马尔洛克 内德马尔洛克 TCMALLOC 它们可能会为您提供更好的对象布局以及转储内存布局的能力

一般方法:

检查应用程序是否可以获得"内存不足"。 压力测试可能会有所帮助。 检查应用有多少可用内存以及它有多碎片化。 如果碎片是问题所在 - 请尝试以下操作: 堆喜欢后进先出原则(删除最后创建的块(。尝试将变量保留在堆栈上。使用专门的分配器。

就您的功能而言:

为了最小化堆压力,您可以尝试将行读取到堆栈缓冲区中(例如,使用 FGETS(

堆碎片会成为此实现的问题吗?

在显示的示例中,我无法识别指示堆碎片的行。

您正在使用std::string其内部机制通常被认为是不可预测的对象,即对象将增长多大以及何时释放内存,仅此而已。

  • 作为第一步,请考虑std::string::capacity以确保更紧凑的内存。

  • 作为第二步,请考虑提供自定义分配器,常规免费存储(堆(的特定替代方案是:堆栈

  • 作为最后一步,考虑使用较少抽象的代码,即指针、数组等,当您更接近硬件时,这是不可避免的解决方案。 特别是当您使用对象只是提取输入并作为参数传递时,即不使用任何std::string特定成员函数等。

最新更新