String string;我一直在网上搜索我们可以在 Arduino或内部存储多少String v[0];。但即使是Arduino 参考页面也没有答案。每次搜索都会有人说您不应该在 Arduino 上使用 String(大写 S),因为它没有足够的内存来处理又大又坏的 String。我不使用 Arduino Uno,所以我不介意 String 是否使用比 std::string 更多的内存。
你们知道 String 对象可以存储的最大长度是多少吗?
String string;我一直在网上搜索我们可以在 Arduino或内部存储多少String v[0];。但即使是Arduino 参考页面也没有答案。每次搜索都会有人说您不应该在 Arduino 上使用 String(大写 S),因为它没有足够的内存来处理又大又坏的 String。我不使用 Arduino Uno,所以我不介意 String 是否使用比 std::string 更多的内存。
你们知道 String 对象可以存储的最大长度是多少吗?
字符串的最大长度取决于您尝试在其中存储内容时有多少可用内存。
Arduino Core 底层的软件维护一个称为“堆”的 RAM 区域,软件可以在运行时从中分配。当需要增加用于其字符串的存储空间时,String调用一个名为(帮助管理堆的标准 C 库函数)的函数。realloc()
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您可以拥有多大的 a:
ESP.getHeapSize()返回堆的总大小,包括分配的和空闲的内存。这将大于String您可以达到的潜在最大值。ESP.getFreeHeap()返回堆中的总可用空间。这也将大于String您可以达到的潜在最大值。ESP.getMaxAllocHeap()返回您可以分配的堆的最大片段的大小。这将近似于String您可以分配的最大值。它可能比 小得多ESP.getFreeHeap()。