Максимальная длина строки зависит от того, сколько памяти свободно, когда вы пытаетесь что-то в ней сохранить.
Программное обеспечение, лежащее в основе Arduino Core, поддерживает область оперативной памяти, называемую «кучей», которую программное обеспечение можетвыделить из во время выполнения.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()
.