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

How many bytes can you store inside a Arduino String?

我一直在 WWW 上搜索我们可以在 Arduino String string;String v[0]; 中存储多少东西。但即使 Arduino Reference page 也没有答案。 每次搜索都以有人说你不应该在 Arduino 上使用字符串(大写 S)结束,因为它没有足够的内存来处理大而坏的字符串。 我不使用 Arduino Uno,所以我不介意 String 使用的内存是否多于 std::string。

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

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

Arduino Core 的底层软件维护着一个称为 "heap" 的 RAM 区域,软件可以在 运行 时间从中分配。 String 在需要增加用于其字符串的存储空间时调用名为 realloc() 的函数(一个帮助管理堆的标准 C 库函数)。

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

不过,最大大小 String 可能比空闲堆的数量小得多。根据您的软件分配和释放内存的方式,堆可能有很多可用的小内存块,它们之间分配了内存 ("heap fragmentation")。所以最大的free piece可能比free heap的总量小很多。

这就是人们建议不要使用 String 的原因。它会频繁分配内存,尤其是修改String个对象时,很容易导致堆碎片化,无法分配大块内存。这种效果在 Arduinos 等具有少量内存的处理器上更为严重。 ESP8266 好一点,因为它有更多的内存。 ESP32 更好,因为它有更多的内存。

由于 String 在无法分配内存时默默地失败,这使情况变得更糟。在那种情况下,您的程序将在没有警告的情况下发生故障。

也就是说,在很多情况下我认为 String 完全可以使用。在 ESP32 上,我会避免在旨在 运行 无限期或在商业软件中使用它。

ESP32 Arduino Core 有一些功能可以帮助您了解 String 您可以拥有多大:

  • ESP.getHeapSize() returns 堆的总大小,包括已分配和可用内存。这将大于您可以达到的最大潜力 String
  • ESP.getFreeHeap() returns 堆中的总空闲 space。这也将大于您可以达到的潜在最大值 String
  • ESP.getMaxAllocHeap() returns 您可以分配的堆的最大片段的大小。这将接近您可以分配的最大 String。它可能比 ESP.getFreeHeap().
  • 小得多