>> Нет.
> Да. Можно делать выделение памяти без выделения памяти. Еще один баянный метод проверить что будет - сделать бесконечную рекурсию.Нет. Для начала, определитесь: выделять или не выделять, потому что ранее вы сами же писали о "выделение памяти под массивы переменного размера в рантайме."
Повторю еще раз, для экспертов выделения без выделения и прочей диалектики: unconstrained массивы в Аде - не аналог VLA.
> Кстати с последним вышел облом, я это под cortex M запилил, мне
> было интересно посмотреть как вообще сработает кастомный обработчик hardfault. А оно хренась и не падает?! Оказывается GCC шибко умный, заинлайнил все, на
> выделение стэка забил. Так что микроконтроль с мизером памяти наворачивает себе бесконечную рекурсию. Сюрприз!
Очень интересно (нет) и познавательно (тоже на самом деле нет) - вы открыли для себя новые грани современной оптимизации компиляторами для бесконечной рекурсии и сделали вывод что "налог VLA" в Аду работает так же грабельно как и в GCC?
Еще раз, для экспертов по интересному смотрению: unconstrained массивы в Аде - не аналог VLA.
>> Ну вот то - выделение памяти под массивы переменного размера в рантайме.
>> например, из внешнего параметра формируемого фиг знает как,
> А на сях можно и не выделять.
Так выделять или не выделять?
> Ну вон на том мк вообще *alloc и free нету.
Это прекрасно, но непонятные претензии были к Аде (потому что аноним решил, что фичи там должны быть реализованны так же, как в GCC)
Т.е. по вашему, реализация ады все равно вставит заглушки для выделения памяти и будет крешится или где?
Это не так:
http://docs.adacore.com/live/wave/gnat_ccg/html/gnatccg_ug/g...
> Dynamic Memory Handling
> The use of dynamic memory (access types, aka pointers) is supported by the
> GNAT Pro CCG compiler, and will generate calls to the standard C functions
> malloc() (for memory allocation) and free() (for deallocation). If dynamic
> memory is used in the Ada sources, then malloc() and possibly free() need to
> be provided by the C compiler.
Идем далее - я так понял, тут был спры^W кейс сильно урезанного рантайма. Что ж:
https://docs.adacore.com/gnathie_ug-docs/html/gnathie_ug/gna...
No_Allocators, -- This restriction ensures at compile time that there are no occurrences of an allocator.
No_Implicit_Heap_Allocations, -- (RM D.8(8), H.4(3))
No_Implicit_Loops,
No_Protected_Type_Allocators,
5.1.13. No_Anonymous_Allocators
[RM H.4] This restriction ensures at compile time that there are no occurrences of an allocator of anonymous access type.
Или это был намек, что Адисты не Сишники, а значит – по умолчанию глупые и недалекие люди и не знают, где и как у них там выделяется память?
Позвольте и тут усомниться.
>> Так что парой нехитрых действий можно поиметь грабель покруче сишников.
> И единственный способ таким манером пятку себе подстрелить - как раз поюзать VLA из C99. И собственно одна из причин по которой их не советуют - надежность снижают.
Давайте без очередного спрыга с темы и самонахваливания, просто пречислите эти самые грабли в Аде.
>> Это тут ключевое.
> Ну вы то как эксперт в управлении памятью нам ща урок грамотности дадите? :)
Хотя вы, как известный эксперт по необоснованным заявлениям, ценному мнению и дартаньянствованию, с последующим спрыгам с темы, уже соломки подстелили, приплетя тут МК и "вообще *alloc и free нету", так и быть:
https://docs.adacore.com/gnat_ugx-docs/html/gnat_ugx/gnat_ug...
> The Secondary Stack
> GNAT returns objects from functions via registers (if small) or via the
> primary stack. For the latter, the caller of the function typically
> allocates space for the return object on its primary stack before the call.
> However, Ada allows functions to return objects of unconstrained types, for
> example unbounded array types such as String, and unconstrained
> discriminated record types
> In this case the caller does not know the size of the returned object at the point of the call.
> To resolve this problem, GNAT provides each task with a secondary stack that objects of unconstrained types are returned on. On native and cross targets using the full run-time, the secondary stack by default is allocated dynamically on the heap.
Надеюсь, что такое "using full run-time" и каковы последствия, объяснять не надо?
На всякий случай, цитирую еще из возможных опций урезания рантайма:
https://docs.adacore.com/gnat_rm-docs/html/gnat_rm/gnat_rm/s...
> No_Secondary_Stack
> [GNAT] This restriction ensures at compile time that the generated code does
> not contain any reference to the secondary stack. The secondary stack is
> used to implement functions returning unconstrained objects (arrays or
> records) on some targets. Suppresses the allocation of secondary stacks for
> tasks (excluding the environment task) at run time.
Все еще с нетерпением ждем список граблей "круче и неочевидней" сишных.