[英]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.