繁体   English   中英

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

[英]How many bytes can you store inside a Arduino String?

我一直在搜索WWW,我们可以在Arduino String string;存储多少内容String string; 或者在String v[0]; 但即使是Arduino Reference页面也没有答案。 每个搜索都以某人说你不应该在Arduino上使用String(大写字母S),因为它没有足够的内存来处理大而坏的字符串。 我不使用Arduino Uno,所以我不介意String使用的内存比std :: string多。

你们有什么想法String对象可以存储的最大长度是多少?

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

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()小得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM