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

时间:2017-08-19 20:04:51

标签: c++ embedded-linux

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

2 个答案:

答案 0 :(得分:1)

很难说你的应用程序是否因代码中的内存碎片而受损。 (你的代码可能会添加一些碎片,但我不知道它有多重要) 你可以尝试使用非标准的malloc库 - jemalloc nedmalloc tcmalloc 它们可能会为您提供更好的对象布局以及转储内存布局的能力

一般方法:

检查应用是否可以获得“内存不足”。压力测试可能有帮助。  检查你的应用程序有多少可用内存以及它是多么分散。  如果碎片是问题 - 请尝试以下方法:  堆喜欢LIFO原则(删除最后创建的块)。尝试将变量保留在堆栈上。使用专门的分配器。

如果你的功能:

为了最小化堆压力,您可以尝试将行读入堆栈缓冲区(例如使用fgets)

答案 1 :(得分:0)

  

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

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

您正在使用std::string对象,其内部机制通常被认为是不可预测的,即对象增长的大小以及何时释放内存,就是这样。

  • 首先考虑std::string::capacity以确保更紧凑的记忆。

  • 第二步考虑提供custom allocators,一般免费商店(堆)的具体替代方案是: Pool Stack

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