您可以在Arduino字符串中存储多少字节?

时间:2019-03-25 16:13:56

标签: c++ arduino-ide esp32 platformio

我一直在WWW上搜索有关我们可以在Arduino String string;String v[0];内部存储多少的信息。但是,Arduino Reference page都没有答案。 每次搜索都以有人说您不应在Arduino上使用String(大写S)结尾,因为它没有足够的内存来处理大而坏的String。 我不使用Arduino Uno,所以我不介意String是否比std :: string使用更多的内存。

你们是否知道String对象可以存储的最大长度是多少?

1 个答案:

答案 0 :(得分:0)

字符串的最大长度取决于您尝试在其中存储内容时可用的内存量。

Arduino Core底层的软件维护一个称为“堆”的RAM区域,该软件可在运行时从中分配。当String需要增加其String所使用的存储时,会调用名为realloc()的函数(帮助管理堆的标准C库函数)。

https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/WString.cpp#L170

最大大小String可能比可用堆的数量小得多。根据您的软件分配和释放内存的方式,堆中可能会有很多可用的小块内存,并在它们之间分配了内存(“堆碎片”)。因此,最大的空闲块可能比空闲堆的总量小得多。

这就是为什么人们建议不要使用String的原因。它经常分配内存,尤其是在您修改String对象的情况下,并且很容易导致堆碎片化,因此您无法分配大块内存。对于像Arduinos这样具有少量内存的处理器,这种影响更为严重。 ESP8266更好一点,因为它有更多的内存。 ESP32更好,因为它具有更多的内存。

String在无法分配内存时会静默失败,这使情况变得更糟。在这种情况下,您的程序只会出现故障而不会发出警告。

也就是说,在很多情况下,我认为String完全可以使用。在ESP32上,我只是避免在打算无限期运行的程序中或在商业销售的软件中使用它。

ESP32 Arduino Core具有一些功能,如果您想了解String可以有多大的功能,可以提供帮助:

  • ESP.getHeapSize()返回堆的总大小,包括已分配和可用的内存。这将大于您可以设置的最大数量String
  • ESP.getFreeHeap()返回堆中的总可用空间。这还将大于您可以设置的最大数量String
  • ESP.getMaxAllocHeap()返回可分配的堆最大片段的大小。这将近似于您可以分配的最大String。它可能比ESP.getFreeHeap()小得多。