Перейти к содержанию
    

Непонятное увеличение RAM

On 12/22/2022 at 10:38 AM, aaarrr said:

Так не бывает.

во втором случае появляется HEAP. он и отжирает всю память. компайлер наверное решает динамически выделить память (иначе как VLA работает). с другой стороны - я опустил HEAP на ноль а проект компилируется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 minute ago, jenya7 said:

с другой стороны - я опустил HEAP на ноль а проект компилируется.

А почему не должен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 10:45 AM, aaarrr said:

А почему не должен?

ну а как тогда 

void Foo(int size)
{
    char arr[size]; 
}

происходит?

либо я влечу в run time exception

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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]

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jenya7 сказал:

ну а как тогда 

void Foo(int size)
{
    char arr[size]; 
}

происходит?

это на стеке происходит

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, tgruzd said:

это на стеке происходит

Мне вот этот момент тоже стал интересен, никогда не делал так и не задумывался. Прибавление стека при вызове функции закладывается на этапе компиляции, но в этом случае на этапе компиляции невозможно определить на какую величину надо его увеличить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 10:51 AM, tgruzd said:

это на стеке происходит

а если потребуется размер больший чем размер стека?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, jenya7 сказал:

а если потребуется размер больший чем размер стека?

тогда  - всё, конец.

2 минуты назад, AndyBig сказал:

никогда не делал так и не задумывался

Я тоже это "не до конца понимаю". но вот есть у меня проект, где я стеки ртос и кучу разместил в разных регионах памяти и могу с уверенность утверждать, что  такие конструкции находятся на стеке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, AndyBig сказал:

Прибавление стека при вызове функции закладывается на этапе компиляции, но в этом случае на этапе компиляции невозможно определить на какую величину надо его увеличить.

Почему бы его не увеличить ещё раз после вызова функции?  Как-то же мы можем вызывать колбэки по указателю, когда на этапе компиляции не известно какая именно функция будет вызвана  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 minutes ago, tgruzd said:

Почему бы его не увеличить ещё раз после вызова функции?

Ну может быть... Я сейчас попробовал создать коротенький пример, чтобы откомпилировать и посмотреть что получится в ассемблерном коде, но мне компилятор IAR вообще запрещает такие фокусы, выдает ошибку "Переменная должна быть константой" на переменную размера массива. Что, в общем-то, логично 🙂

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/22/2022 at 11:17 AM, AndyBig said:

Ну может быть... Я сейчас попробовал создать коротенький пример, чтобы откомпилировать и посмотреть что получится в ассемблерном коде, но мне компилятор IAR вообще запрещает такие фокусы, выдает ошибку "Переменная должна быть константой" на переменную размера массива. Что, в общем-то, логично 🙂

Options->C/C++ Compiler->C dialect->C99->Allow VLA

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, jenya7 said:

Options->C/C++ Compiler->C dialect->C99->Allow VLA

Точно, заработало. Память для массива с длиной, определяемой переменной, выделяется из HEAP. Со стеком ничего интересного не происходит, все стандартно 🙂 Если убрать это безобразие из кода, то HEAP оптимизируется и оперативка под него не резервируется.

image.thumb.png.57830b3560e9dfaf3854c74dc73428ec.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...