簡體   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