На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (78) « Первая ... 53 54 [55] 56 57 ...  77 78  ( Перейти к последнему сообщению )  
> Текущий Стандарт С++ и перспективы его развития
    Цитата Kray74 @
    Цитата MyNameIsIgor @
    А сделать аллокатор для стека не представляется возможным... а может и возможно, но imho костыльно будет.

    stack_alloc

    Как я понял, там размер параметром шаблона задаётся - костыльно, да, по сравнению с runtime-sized массивами.
      извините, я не в теме, а как можно вообще разместить на стеке массив динамической длины? оО
        Цитата Radagast @
        извините, я не в теме, а как можно вообще разместить на стеке массив динамической длины? оО
        Она (длина) условно динамическая. Размер массива доолжен быть известен при входе в функцию (например, размер - один из аргументов функции), тогда компилятор при резервировании места для локальных переменных, может сразу зарезервировать место под массив. Вроде так.
        AFAIK, изменять размер уже созданного массива нельзя.
        Сообщение отредактировано: applegame -
          Цитата Radagast @
          извините, я не в теме, а как можно вообще разместить на стеке массив динамической длины?

          Ну, а как происходит резервирование стека? Простым изменением значения регистра. Никто не мешает менять его на любое число.
          Цитата applegame @
          Она (длина) условно динамическая. Размер массива доолжен быть известен при входе в функцию (например, размер - один из аргументов функции), тогда компилятор при резервировании места для локальных переменных, может сразу зарезервировать место под массив. Вроде так.

          Очередная показуха своей безграмотности? :facepalm:
            Цитата MyNameIsIgor @
            там размер параметром шаблона задаётся - костыльно, да, по сравнению с runtime-sized массивами

            runtime-sized платформо-независимо не получится (и потому boost от этого отказался), но вообще-то есть _malloca в VC++ и alloca в gcc, было бы желание.
              Цитата liss @
              runtime-sized платформо-независимо не получится (и потому boost от этого отказался), но вообще-то есть _malloca в VC++ и alloca в gcc, было бы желание.

              Если есть реализации, то почему кроссплатформенно не получится?
              Мне кажется, что там проблема в куче заботливо разложенных граблей...
                мотивировка была простая: эти функции не часть какого-либо стандарта (для буста это означает, что будут поддерживаться лишь полтора конкретных компилятора, и без гарантий на будущее).
                написать алокатор для конкретного случая нетрудно. граблей будет ровно столько же, сколько в реализации n3662, т.е. придется соблюдать определенные правила.
                  Цитата niXman @
                  рыбятки, тема-то была не изгажена ;)
                  MyNameIsIgor любую тему изгадит. Вместо того чтобы указать, что именно неверно (как и делают нормальные люди) он предпочитает грубить. Что касается моей "отсебятины", то я ошибся в том, что место под массив выделяется не на входе в функцию, а в точке декларации массива.

                  Цитата MyNameIsIgor @
                  Мне надоело кидать зёрна истины в бетонную стену вашего разума - только и всего. Или вы полагаете, что я вам чем-то обязан и буду "оставаться в топике" до второго пришествия?
                  Предлагаю вернуться к этой теме в HolyWars, если вы все еще считаете что вы правы. Вот мой последний ответ уже с сылкой на сайт Microsoft - Есть ли будущее у Microsoft?
                  Сообщение отредактировано: applegame -
                    Вообще-то alloca в gcc выделяет память не в стеке а в куче. И возвращает ссылку на выделенную память (аналогично malloc). Просто он отслеживает эти ссылки и освобождает эту память, как только выяснит, что произошёл выход из вызвавшей его функции.
                      Цитата amk @
                      Вообще-то alloca в gcc выделяет память не в стеке а в куче.

                      а можно взглянуть на пруф?
                      а то я только это нашел, но оно для Sparc32.
                        Оно везде такое. alloca() на стеке память выделяет.
                          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.
                            судя по коду для спарк32, оно так и есть.
                            просто хотелось бы увидеть код для i386.
                              niXman, ты же сам сборки gcc делаешь. У тебя должны быть исходники, в том числе и alloca.

                              Но, похоже, вы правы. Посмотрел сейчас в заголовке - alloca реализуетсячерез встроенную функцию компилятора __builtin_alloca. А это скорее всего означает, что компилятор выделяет память на стеке. Скорее всего просто сдвигает вершину стека и возвращает новую его позицию. Возможно как-то влияет на компиляцию функции, чтобы учесть, что стек сдвинут.
                              Реализуется скорее всего цепочкой инструкций типа
                              ExpandedWrap disabled
                                mov ax,<size>
                                sub sp,ax
                                mov ax,sp

                              В DECUS C (PDP-11, RT-11 или RSX-11) за это отвечала обычная функция. В нём управление стеком позволяло произвольно сдвигать вершину стека. Эта функция выбирала из стека адрес возврата, сдвигала указатель стека, копировала его в регистр 0 и выполняла переход на выбранный ранее адрес возврата.
                                Цитата amk @
                                У тебя должны быть исходники, в том числе и alloca.

                                mingw, в качестве CRT, использует msvcrt.dll. а где взять эти исходники, я не в курсе.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (78) « Первая ... 53 54 [55] 56 57 ...  77 78


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0870 ]   [ 16 queries used ]   [ Generated: 19.06.25, 10:14 GMT ]