reserve() толь работает, толь нет.

Vladikas
Offline
Зарегистрирован: 25.07.2013

Пытался сам разобраться, как оно работает, но мозг моментально закипел. 

Исходный код:

String buf;
Serial.print(F("buf.reserve(626); "));
Serial.println(buf.reserve(626));

buf ="{\n";
buf = buf + "  \"devices\": [\n";
buf = buf + "    {\n";
buf = buf + "      \"mac\": \"";
и тд

Отладка:

buf.reserve(626); 1
[String] Reallocating large String(138 -> 160 bytes) '{
  "devic ...         {
'........
куча подобного
.........
[String] Reallocating large String(620 -> 626 bytes) '{
  "devic ... }
      ]
' 

Получается, что reserve() не работает? Почему? Или забить болт и не обращать внимание?

PS Arduino IDE 1.8.19 /ESP8266

b707
Offline
Зарегистрирован: 26.05.2017

а цель-то в чем?

Вы в курсе, что String и без reserve() автоматически расширяет размер, если вы увеличиваете длину строки? -тогда нафига эта резервация?

rkit
Offline
Зарегистрирован: 23.11.2016

Наверно +=, всё же.

b707
Offline
Зарегистрирован: 26.05.2017

rkit пишет:

Наверно +=, всё же.

хм, а оптимизатору не все равно - buf = buf+... или buf+=... ?

rkit
Offline
Зарегистрирован: 23.11.2016

Оптимизатор такие вещи не пережевывает сам по себе, это не примитивный тип. Можно для него написать определенных подсказок, но их нет, потому что библиотека arduino написана под C++03, где такого еще не было.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А что reverse делается и печатается для пустой строки, а потом уже со строкой манипуляции проходят?

Если нет, то будьте так любезны выложить актуальный код полностью, без и т.д.

Vladikas
Offline
Зарегистрирован: 25.07.2013

rkit пишет:

Наверно +=, всё же.

Так всё заработало. Спасибо!

b707
Offline
Зарегистрирован: 26.05.2017

Vladikas пишет:

Так всё заработало. Спасибо!

вопросов стало еще больше... что именно заработало? Если вы про код - а раньше он не работал, что ли?