
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.21] |
![]() |
|
Страницы: (78) « Первая ... 53 54 [55] 56 57 ... 77 78 ( Перейти к последнему сообщению ) |
Сообщ.
#811
,
|
|
|
Цитата Kray74 @ Цитата MyNameIsIgor @ А сделать аллокатор для стека не представляется возможным... а может и возможно, но imho костыльно будет. stack_alloc Как я понял, там размер параметром шаблона задаётся - костыльно, да, по сравнению с runtime-sized массивами. |
Сообщ.
#812
,
|
|
|
извините, я не в теме, а как можно вообще разместить на стеке массив динамической длины? оО
|
Сообщ.
#813
,
|
|
|
Цитата Radagast @ Она (длина) условно динамическая. Размер массива доолжен быть известен при входе в функцию (например, размер - один из аргументов функции), тогда компилятор при резервировании места для локальных переменных, может сразу зарезервировать место под массив. Вроде так.извините, я не в теме, а как можно вообще разместить на стеке массив динамической длины? оО AFAIK, изменять размер уже созданного массива нельзя. |
Сообщ.
#814
,
|
|
|
Цитата Radagast @ извините, я не в теме, а как можно вообще разместить на стеке массив динамической длины? Ну, а как происходит резервирование стека? Простым изменением значения регистра. Никто не мешает менять его на любое число. Цитата applegame @ Она (длина) условно динамическая. Размер массива доолжен быть известен при входе в функцию (например, размер - один из аргументов функции), тогда компилятор при резервировании места для локальных переменных, может сразу зарезервировать место под массив. Вроде так. Очередная показуха своей безграмотности? ![]() |
Сообщ.
#815
,
|
|
|
Цитата MyNameIsIgor @ там размер параметром шаблона задаётся - костыльно, да, по сравнению с runtime-sized массивами runtime-sized платформо-независимо не получится (и потому boost от этого отказался), но вообще-то есть _malloca в VC++ и alloca в gcc, было бы желание. |
Сообщ.
#816
,
|
|
|
Цитата liss @ runtime-sized платформо-независимо не получится (и потому boost от этого отказался), но вообще-то есть _malloca в VC++ и alloca в gcc, было бы желание. Если есть реализации, то почему кроссплатформенно не получится? Мне кажется, что там проблема в куче заботливо разложенных граблей... |
Сообщ.
#817
,
|
|
|
мотивировка была простая: эти функции не часть какого-либо стандарта (для буста это означает, что будут поддерживаться лишь полтора конкретных компилятора, и без гарантий на будущее).
написать алокатор для конкретного случая нетрудно. граблей будет ровно столько же, сколько в реализации n3662, т.е. придется соблюдать определенные правила. |
Сообщ.
#818
,
|
|
|
MyNameIsIgor любую тему изгадит. Вместо того чтобы указать, что именно неверно (как и делают нормальные люди) он предпочитает грубить. Что касается моей "отсебятины", то я ошибся в том, что место под массив выделяется не на входе в функцию, а в точке декларации массива.
Цитата MyNameIsIgor @ Предлагаю вернуться к этой теме в HolyWars, если вы все еще считаете что вы правы. Вот мой последний ответ уже с сылкой на сайт Microsoft - Есть ли будущее у Microsoft? Мне надоело кидать зёрна истины в бетонную стену вашего разума - только и всего. Или вы полагаете, что я вам чем-то обязан и буду "оставаться в топике" до второго пришествия? |
Сообщ.
#819
,
|
|
|
Вообще-то alloca в gcc выделяет память не в стеке а в куче. И возвращает ссылку на выделенную память (аналогично malloc). Просто он отслеживает эти ссылки и освобождает эту память, как только выяснит, что произошёл выход из вызвавшей его функции.
|
Сообщ.
#820
,
|
|
|
Цитата amk @ Вообще-то alloca в gcc выделяет память не в стеке а в куче. а можно взглянуть на пруф? а то я только это нашел, но оно для Sparc32. |
Сообщ.
#821
,
|
|
|
Оно везде такое. alloca() на стеке память выделяет.
|
Сообщ.
#822
,
|
|
|
http://man7.org/linux/man-pages/man3/alloca.3.html
Цитата The alloca() function allocates size bytes of space in the stack frame of the caller. |
Сообщ.
#823
,
|
|
|
судя по коду для спарк32, оно так и есть.
просто хотелось бы увидеть код для i386. |
Сообщ.
#824
,
|
|
|
niXman, ты же сам сборки gcc делаешь. У тебя должны быть исходники, в том числе и alloca.
Но, похоже, вы правы. Посмотрел сейчас в заголовке - alloca реализуетсячерез встроенную функцию компилятора __builtin_alloca. А это скорее всего означает, что компилятор выделяет память на стеке. Скорее всего просто сдвигает вершину стека и возвращает новую его позицию. Возможно как-то влияет на компиляцию функции, чтобы учесть, что стек сдвинут. Реализуется скорее всего цепочкой инструкций типа ![]() ![]() mov ax,<size> sub sp,ax mov ax,sp В DECUS C (PDP-11, RT-11 или RSX-11) за это отвечала обычная функция. В нём управление стеком позволяло произвольно сдвигать вершину стека. Эта функция выбирала из стека адрес возврата, сдвигала указатель стека, копировала его в регистр 0 и выполняла переход на выбранный ранее адрес возврата. |
Сообщ.
#825
,
|
|
|
Цитата amk @ У тебя должны быть исходники, в том числе и alloca. mingw, в качестве CRT, использует msvcrt.dll. а где взять эти исходники, я не в курсе. |