Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌入式系统中读取文件的内存碎片_C++_Embedded Linux - Fatal编程技术网

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

C++ 嵌入式系统中读取文件的内存碎片,c++,embedded-linux,C++,Embedded Linux,我在带有Linux操作系统的嵌入式系统上有一个配置文本文件。 要求文件为文本,嵌入式系统具有 32兆字节的动态ram。应用程序。这将读取文件在C++中编码。 可以使用这样的方法读取文件 #include <string> #include <fstream> ifstream infile ("config_file_path"); if (infile.good()) { string line; // Set capacity to l

我在带有Linux操作系统的嵌入式系统上有一个配置文本文件。 要求文件为文本,嵌入式系统具有 32兆字节的动态ram。应用程序。这将读取文件在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);
    }
}
#包括
#包括
ifstream infle(“配置文件路径”);
if(infle.good())
{
弦线;
//将容量设置为最长线路的长度。
常量无符号字符maxLen=100;
线路储备(maxLen);
while(std::getline(infle,line))
{ 
//处理行中的数据。
过程数据(行);
}
}
堆碎片会是这个实现的一个问题吗?
该文件最多可读取150行文本。

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

一般做法:

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

对于您的功能:

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

堆碎片会是这个实现的一个问题吗

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

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

    >P>作为第一步考虑,以确保更紧凑的内存。

    >P>作为第二步考虑,对一般自由存储(堆)的具体替代是:池和堆栈。

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


您可以将字符串与自定义分配器一起使用,以便按照您希望的方式分配内存,以解决您希望出现的哪类问题?32MB是相当大的内存块。但为了避免任何碎片,我建议分配一个与文件大小相同的块,并将其与文件内容一起加载(无缓冲,带“read”)。忘记“字符串”,使用“char*”取决于此代码的生存期。如果执行一次并很快结束-可能没有问题。如果您需要高健壮性和可用性,请保持简单。由于您总是以相同的字符串读取,并且您希望最长的行比保留的大小短,因此在开始时应该只有一个分配,因此我不希望出现特殊问题。感谢所有回复。我会考虑加载一个包含文件内容的char数组并使用它。在在线阅读了一些内容后,我对堆上的字符串分配感到担忧,作者建议不要在嵌入式设备上这样做。但是我们有相当大的内存。谢谢你的回复。当保留足够大的容量时,单个字符串的容量永远不会改变。我会考虑制作一个自定义分配器和一个char数组来保存数据和字符指针来工作。谢谢你的信息。堆栈缓冲区是保存数据的好方法。这还没有实施。我关心的是如何最大限度地减少堆的使用。