РАЗБОР предложенного случая framer Вы мосье тонкий провокатор!
Во первых здравствуйте!
по делу
1. шаг один (пустой) и шаг два ( добавили std::string s("123"); )
из картинок следует что объм ни кода ни озу сильно не изменился.
диагноз: вы только оъявили s("123"), и не вызвали ни одного метода.
что сделал комилятор - он в флеш сложил константу "123", и возможно разместил на стеке объект std::string.
если обращений к объекту s небыло, то он мог бы вообще выдрать все это и код бинарей совпал бы до бита (я такого поведения добиваюсь).
2. шаг три std::vector<float> v{1.0,2.0,3.0};
аналогично предыдущему.
3. шаг четыре
std::stringstream ss;
наступило жоппа. почему? потому что она и раньше была но вы ее не заметили.
фактически если бы Вы начали трясти объекты s и v то неизбежно пришлось бы (внутри кода STL) вызывать стандартный аллокатор и он бы потянул за собой malloc free или вообще не собрался бы.
соответственно тут код кучи malloc/free где то у Вас всплывет и жоппа наступит в шаге один!
теперь про ss - эта зараза кроме аллокатора еще по своей природе требует ввода вывода и прочих libc вызовов как то ( towupper, vsnprintf, strftime, _sbrk, _malloc_r, __exidx_start, __exidx_end, и т.д. до усраки)
соответственно - проблема не в С++, а втом что некоторые контейнеры из STL используют "древние как говно мамонта С-like вызовы из libc", ну так была традиция на больших машинах ... но какое это отношение имеет к С++ и эмбеддед??????? никакого!
как на мой взгляж нужно смотреть на эти вещи
1. мы ленивые и нам нравится в C++ то чего нет в C - string, vector, map, .... 100500 еще..
2. хорошо! но нужно немного потрудится. вот взять просто и просто взять функционал STL нельзя! есть прикрутки к libc - в первую очередь распределение динамической памяти и ввод-вывод. если у Вас все скомпилировалось и даже запустилось с первого раза - знайте - у Вас все очень плохо! Обычно в проект линкер затянул вызовы из newlib или че там в виде аналога у всяких кейлов и яров. так вот там внутри гарантированный говнокод котрым Вы не управляете.
3. С++ и STL к счастью придумывали не современные люди - а те кто на pdp-11 писали в кодах. Поэтому они предусмотрели как это решить.
4. мы берем и своими ручками реализуем аллокатор памяти, ввод-вывод или еще что то что требует конкретный класс объекта stl и суем ему в шаблон! фисе! С ЭТОГО МОМЕНТА ВСЕ РАБОТАЕТ КАК НАМ НАДА А НЕ ТАК КАК ТАМ ИНДИЙСКИЙ ВАСЯ НАПИСАЛ внутри newlib.
более того - писатель newlib в принципе не знает на каком микроконтроллере Вы будете кодить и понятия не знает про его периферию, а ВЫ знаете - поэтому можете ввод вывод написать с использованием dma.
ну и че в остатке - все тоже - С++ нужно уметь, а после того как его уметь, нкжно еще уметь правильно прикрутить к тому к чему это кодится. по простому из коробки это только если я выложу свой sdk в котором могие финты уже проделаны. например искорено в принципе такое как printf (заменено на шаблоны с проверкой типа аргумента на этапе компиляции), реализован быстрый аллокатор памяти с возможностью забора байтов и разных сегментов озу (что характерно для современных mcu - разные куски озу на разных шинах в одном девайсе), аналог cout
тут к сожалению нужно код и результат представлять - за пять минут я не могу это сделать.