您可以在 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()
. 小得多
我一直在 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()
. 小得多