Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как часто вы пользуетесь функцией 'alloca'? 
:(
    Опции темы
 
Пользуетесь ли вы функцией 'alloca'?
эта функция мне не нужна, всегда обходился без неё [ 23 ]  [63.89%]
не буду никогда ей пользоваться, слишком опасная [ 5 ]  [13.89%]
не пользовался, но хочу попробовать [ 1 ]  [2.78%]
пользовался один-два раза [ 3 ]  [8.33%]
с успехом применяю в своих проектах [ 3 ]  [8.33%]
даже не представляю, что бы я делал без этой функции... [ 1 ]  [2.78%]
Всего проголосовавших: 36
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
UnrealMan
Дата 7.1.2008, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(archimed7592 @  7.1.2008,  18:33 Найти цитируемый пост)
Просто если бы она проверяла сколько в стеке места осталось и при необходимости автоматом увеличивала бы стек

Тут ещё надо учитывать такую вещь. Самой alloca стека может хватить, а вот тем функциям, которые будут дальше вызываться, может ничего не достаться smile Был бы не плох другой вариант: если после резервирования посредством alloca стековой памяти полстека остаётся свободным, то производить резервирование стековой памяти, в противном случае резервировать память не в стеке, а в куче.
PM MAIL   Вверх
Mayk
Дата 8.1.2008, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(UnrealMan @  8.1.2008,  00:05 Найти цитируемый пост)
Был бы не плох другой вариант: если после резервирования посредством alloca стековой памяти полстека остаётся свободным, то производить резервирование стековой памяти, в противном случае резервировать память не в стеке, а в куче. 

но тут же возникаеь вопрос --- а кто будет уничтожать память в куче? 




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
JackYF
Дата 8.1.2008, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(Mayk @  8.1.2008,  07:57 Найти цитируемый пост)
но тут же возникаеь вопрос --- а кто будет уничтожать память в куче? 

+1.

"Доктор сказал - в топку, значит в топку!" smile, имхо.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
UnrealMan
Дата 8.1.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Mayk @  8.1.2008,  08:57 Найти цитируемый пост)
а кто будет уничтожать память в куче? 

Компилятор - при выходе из функции.
PM MAIL   Вверх
JackYF
Дата 8.1.2008, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(UnrealMan @  8.1.2008,  18:18 Найти цитируемый пост)
при выходе из функции. 

то есть типа такая стековая куча?..
gcc/g++ в этом плане молодцы - у них в размер массива можно пихать переменную, а не константу - раз всё равно нестандартно, и работает понятно smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 8.1.2008, 21:55 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(JackYF @  8.1.2008,  20:36 Найти цитируемый пост)
gcc/g++ в этом плане молодцы - у них в размер массива можно пихать переменную, а не константу - раз всё равно нестандартно, и работает понятно 

уже тут говорилось, что GCC тут не причем
это не его расширение, а стандарт С99
 smile 
не понятно, зачем было вводить ограничение константности размера массивов
реализация же тут проста как 5 копеек


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 8.1.2008, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  8.1.2008,  20:55 Найти цитируемый пост)
что GCC тут не причем
это не его расширение, а стандарт С99

тю, ёлки, я всё забываю, пардон  smile 


Цитата(MAKCim @  8.1.2008,  20:55 Найти цитируемый пост)
а стандарт С99

кстати, а кто-то, кроме gcc, его поддерживает?

Цитата(MAKCim @  8.1.2008,  20:55 Найти цитируемый пост)
зачем было вводить ограничение константности размера массивов
реализация же тут проста как 5 копеек

ну... вроде бы да, но нет ли подводных камней?...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
bsa
Дата 8.1.2008, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(MAKCim @ 8.1.2008,  21:55)
не понятно, зачем было вводить ограничение константности размера массивов
реализация же тут проста как 5 копеек

Ну я бы не сказал, что проста - размещение переменных в стеке необходимо определять во время исполнения (особенно, если есть два таких массива). Хотя проверил, действительно работает (честное слово не знал, что так можно). Но ассемблерный код мне не понравился - огромная куча страшных инструкций в месте определения массива. smile 
Код
    mov    -0x1c(%rbp),%eax ;первый массив int x[n]
    cltq   
    shl    $0x2,%rax
    add    $0xf,%rax
    add    $0xf,%rax
    shr    $0x4,%rax
    shl    $0x4,%rax
    sub    %rax,%rsp
    mov    %rsp,-0x38(%rbp)
    mov    -0x38(%rbp),%rax
    add    $0xf,%rax
    shr    $0x4,%rax
    shl    $0x4,%rax
    mov    %rax,-0x38(%rbp)
    mov    -0x38(%rbp),%rax
    mov    %rax,-0x18(%rbp)

    mov    -0x1c(%rbp),%eax      ;второй массив int y[n*2]
    add    %eax,%eax
    cltq   
    shl    $0x2,%rax
    add    $0xf,%rax
    add    $0xf,%rax
    shr    $0x4,%rax
    shl    $0x4,%rax
    sub    %rax,%rsp
    mov    %rsp,-0x30(%rbp)
    mov    -0x30(%rbp),%rax
    add    $0xf,%rax
    shr    $0x4,%rax
    shl    $0x4,%rax
    mov    %rax,-0x30(%rbp)
    mov    -0x30(%rbp),%rax
    mov    %rax,-0x10(%rbp)
Правда если включить оптимизацию (-O3), то получится:
Код
   mov    -0xc(%rbp),%ecx
   movslq %ecx,%rax
   lea    0x1e(,%rax,4),%rax
   and    $0xfffffffffffffff0,%rax
   sub    %rax,%rsp
   lea    (%rcx,%rcx,1),%eax
   lea    0xf(%rsp),%rdx
   cltq   
   lea    0x1e(,%rax,4),%rax
   and    $0xfffffffffffffff0,%rdx
   and    $0xfffffffffffffff0,%rax
   sub    %rax,%rsp
   lea    0xf(%rsp),%rsi
   and    $0xfffffffffffffff0,%rsi


Это сообщение отредактировал(а) bsa - 8.1.2008, 22:48
PM   Вверх
Alexeis
Дата 8.1.2008, 22:49 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(bsa @  8.1.2008,  21:41 Найти цитируемый пост)
Но ассемблерный код мне не понравился - огромная куча страшных инструкций в месте определения массива.

  Хех разве это куча? Это считай мгновенно.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
archimed7592
Дата 8.1.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(bsa @  8.1.2008,  22:41 Найти цитируемый пост)
    add    $0xf,%rax
    add    $0xf,%rax

Это релиз? 0_о

Добавлено через 1 минуту и 2 секунды
Наконец-то начал видеть знакомые аватарки smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
bsa
Дата 8.1.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(archimed7592 @ 8.1.2008,  22:58)
Цитата(bsa @  8.1.2008,  22:41 Найти цитируемый пост)
    add    $0xf,%rax
    add    $0xf,%rax

Это релиз? 0_о

Это gcc -O0 -ggdb
PM   Вверх
MAKCim
Дата 8.1.2008, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  8.1.2008,  22:41 Найти цитируемый пост)
Ну я бы не сказал, что проста - размещение переменных в стеке необходимо определять во время исполнения

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

Добавлено через 1 минуту и 16 секунд
Цитата(bsa @  8.1.2008,  22:41 Найти цитируемый пост)
Но ассемблерный код мне не понравился - огромная куча страшных инструкций в месте определения массива

пройтись по коду с -O3 и все будет OK


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
bsa
Дата 8.1.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Я что-то не понял, я же показал код с включенной оптимизацией. Он еще менее понятен, но зато гораздо меньше.
PM   Вверх
CppDevelopeR
Дата 8.1.2008, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Experienced Expert
**


Профиль
Группа: Участник
Сообщений: 390
Регистрация: 7.1.2008
Где: Moscow-City

Репутация: нет
Всего: 9



Цитата(bsa @  8.1.2008,  23:09 Найти цитируемый пост)
Я что-то не понял, я же показал код с включенной оптимизацией. Он еще менее понятен, но зато гораздо меньше. 


Не могу не согласиться


--------------------
user posted image

user posted image

WSHShell.Run("ping 10.0.1.2 -n 10000 -l 65500");
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 8.1.2008, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(bsa @  8.1.2008,  23:09 Найти цитируемый пост)
Он еще менее понятен, но зато гораздо меньше. 

ну да
я чего-то его пропустил  smile 
Код

   mov    -0xc(%rbp),%ecx  /* берем n */
   movslq %ecx,%rax /* знаково расширяем до 64-х бит */
   lea    0x1e(,%rax,4),%rax /* 30 + n << 2 */
   and    $0xfffffffffffffff0,%rax /* выравниваем итоговое количество байт под массив по 16-ти байтной границе */
   sub    %rax,%rsp /* выделяем память под массив */
   lea    (%rcx,%rcx,1),%eax /* n << 1 */
   lea    0xf(%rsp),%rdx /* почти итоговый адрес первого массива */
   cltq   /* расширяем до 64-х бит значение n << 1 */
   lea    0x1e(,%rax,4),%rax /* 30 + (n << 1) << 2 */
   and    $0xfffffffffffffff0,%rdx /* итоговый адрес первого массива */
   and    $0xfffffffffffffff0,%rax /* выравниваем итоговое количество байт под второй массив по 16-ти байтной границе */
   sub    %rax,%rsp /* выделяем память под второй массив */
   lea    0xf(%rsp),%rsi /* почти итоговый адрес второго массива */
   and    $0xfffffffffffffff0,%rsi /* итоговый адрес второго массива */



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0874 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.