ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
1152075 Топик полностью
klen (06.12.2021 19:25, просмотров: 689) ответил framer на Наброшу.
РАЗБОР предложенного случая 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


тут к сожалению нужно код и результат представлять - за пять минут я не могу это сделать.