jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба On 12/22/2022 at 10:38 AM, aaarrr said: Так не бывает. во втором случае появляется HEAP. он и отжирает всю память. компайлер наверное решает динамически выделить память (иначе как VLA работает). с другой стороны - я опустил HEAP на ноль а проект компилируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 1 minute ago, jenya7 said: с другой стороны - я опустил HEAP на ноль а проект компилируется. А почему не должен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба On 12/22/2022 at 10:45 AM, aaarrr said: А почему не должен? ну а как тогда void Foo(int size) { char arr[size]; } происходит? либо я влечу в run time exception Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 7 minutes ago, jenya7 said: MAP так глубоко не копает Странно. У меня IAR копает _tim_mseconds 0x2000'3580 0x4 Data Lc timer.o [1] _tim_seconds 0x2000'3584 0x4 Data Lc timer.o [1] _tim_ticks 0x2000'3548 0x8 Data Lc timer.o [1] abort 0x801'42ed 0x6 Code Gb abort.o [14] abs 0x801'1251 0x8 Code Wk abs.o [14] adata 0x801'6600 0x100 Data Lc terminal.o [13] bAlarmActive 0x2000'35be 0x1 Data Gb ccthread.o [1] bBlink 0x2000'35ba 0x1 Data Gb ccthread.o [1] bDeviceState 0x2000'3598 0x4 Data Gb usb_pwr.o [6] bDispPowered 0x2000'35bc 0x1 Data Gb ccthread.o [1] bExtSetMode 0x2000'35c4 0x1 Data Gb ccthread.o [1] bIntPackSOF 0x2000'35d1 0x1 Data Gb usb_istr.o [6] Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 1 минуту назад, jenya7 сказал: ну а как тогда void Foo(int size) { char arr[size]; } происходит? это на стеке происходит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 3 minutes ago, tgruzd said: это на стеке происходит Мне вот этот момент тоже стал интересен, никогда не делал так и не задумывался. Прибавление стека при вызове функции закладывается на этапе компиляции, но в этом случае на этапе компиляции невозможно определить на какую величину надо его увеличить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба On 12/22/2022 at 10:51 AM, tgruzd said: это на стеке происходит а если потребуется размер больший чем размер стека? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 1 минуту назад, jenya7 сказал: а если потребуется размер больший чем размер стека? тогда - всё, конец. 2 минуты назад, AndyBig сказал: никогда не делал так и не задумывался Я тоже это "не до конца понимаю". но вот есть у меня проект, где я стеки ртос и кучу разместил в разных регионах памяти и могу с уверенность утверждать, что такие конструкции находятся на стеке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 11 minutes ago, jenya7 said: либо я влечу в run time exception Бинго! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tgruzd 11 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 9 минут назад, AndyBig сказал: Прибавление стека при вызове функции закладывается на этапе компиляции, но в этом случае на этапе компиляции невозможно определить на какую величину надо его увеличить. Почему бы его не увеличить ещё раз после вызова функции? Как-то же мы можем вызывать колбэки по указателю, когда на этапе компиляции не известно какая именно функция будет вызвана Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 8 minutes ago, tgruzd said: Почему бы его не увеличить ещё раз после вызова функции? Ну может быть... Я сейчас попробовал создать коротенький пример, чтобы откомпилировать и посмотреть что получится в ассемблерном коде, но мне компилятор IAR вообще запрещает такие фокусы, выдает ошибку "Переменная должна быть константой" на переменную размера массива. Что, в общем-то, логично 🙂 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба On 12/22/2022 at 11:17 AM, AndyBig said: Ну может быть... Я сейчас попробовал создать коротенький пример, чтобы откомпилировать и посмотреть что получится в ассемблерном коде, но мне компилятор IAR вообще запрещает такие фокусы, выдает ошибку "Переменная должна быть константой" на переменную размера массива. Что, в общем-то, логично 🙂 Options->C/C++ Compiler->C dialect->C99->Allow VLA Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 13 minutes ago, jenya7 said: Options->C/C++ Compiler->C dialect->C99->Allow VLA Точно, заработало. Память для массива с длиной, определяемой переменной, выделяется из HEAP. Со стеком ничего интересного не происходит, все стандартно 🙂 Если убрать это безобразие из кода, то HEAP оптимизируется и оперативка под него не резервируется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gridinp 3 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба но char arguments[FUNC_ARGS_MAX][FUNC_ARG_LEN]; это же 16 килобайт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AndyBig 8 22 декабря, 2022 Опубликовано 22 декабря, 2022 · Жалоба 4 minutes ago, gridinp said: но char arguments[FUNC_ARGS_MAX][FUNC_ARG_LEN]; это же 16 килобайт 7*128=896 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться