Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > alloca - выделение дин. памяти на стеке


Автор: Alexeis 3.1.2008, 17:13
  ОК тогда есть еще добавление. Стандартная библиотека допускает создание динамических массивов в стеке. Очень быстрое выделение памяти, всего несколько команд.
Пример
Код

  byte* a = (byte*)alloca(20 * sizeof(byte));


Такие массивы не нужно удалять, так как они удаляются сами по выходу из функции.

Автор: archimed7592 3.1.2008, 17:18
Цитата(Alexeis @  3.1.2008,  17:13 Найти цитируемый пост)
ОК тогда есть еще добавление.

Нет такой ф-ции(ни в С, ни в C++).
Microsoft - это не язык smile.

Добавлено через 1 минуту и 30 секунд
Цитата(bsa @  3.1.2008,  17:14 Найти цитируемый пост)
This function is not in POSIX.1-2001.

Такой ф-ции просто по определению не может быть в POSIX'е, ибо управление стеком - это не API, это уже ближе к устройству компилятора.

Автор: Alexeis 3.1.2008, 17:39
Цитата(archimed7592 @  3.1.2008,  16:18 Найти цитируемый пост)
Нет такой ф-ции(ни в С, ни в C++).
Microsoft - это не язык 

  Очень даже есть, причем это поддерживается не только мелкомягкими это справедливо для всей платформы win32 и для линукса (другое дело что его не было в старых версиях) и даже для мобильных платформ. Иногда она в malloc.h иногда в alloca.h.
  Удобная штука, ну не хотите как хотите  smile 

Автор: archimed7592 3.1.2008, 17:43
Цитата(Alexeis @  3.1.2008,  17:39 Найти цитируемый пост)
Очень даже есть

Видишь ли, когда идёт речь о наличии ф-ции в языке, то подразумевается её наличие в стандартной библиотеке, а стандартная библиотека - это та, что описана в стандарте языка(ISO/IEC, C: 9899, C++: 14882).


Цитата(Alexeis @  3.1.2008,  17:39 Найти цитируемый пост)
Удобная штука, ну не хотите как хотите  smile  

Да не то чтобы не хотим smile. Не стоит приучать новичков пользоваться нестандартными расширениями.

Автор: JackYF 3.1.2008, 17:43
Цитата

$ man alloca
No manual entry for alloca

Автор: Alexeis 3.1.2008, 17:47
Цитата(JackYF @  3.1.2008,  16:43 Найти цитируемый пост)
No manual entry for alloca

  Обычно она подставляется как макрос для еще большей эффективности, потому может и нет точки входа.

Автор: archimed7592 3.1.2008, 17:48
Цитата(Alexeis @  3.1.2008,  17:47 Найти цитируемый пост)
Обычно она подставляется как макрос для еще большей эффективности, потому может и нет точки входа. 

Давай ты сейчас скажешь, что ты пошутил, ладно? smile

Автор: JackYF 3.1.2008, 17:53
Цитата(archimed7592 @  3.1.2008,  17:48 Найти цитируемый пост)
Давай ты сейчас скажешь, что ты пошутил, ладно?

дваждую.

На другой машине ман нашёлся. Но это жестоко.
Итак, избранное:

Цитата

If  the  allocation causes stack overflow, program behaviour is undefined.

The  inlined  code often consists of a single instruction adjusting the stack pointer, and does not check for stack overflow.  Thus, there is no NULL error return.

The alloca() function is machine and compiler dependent. On many systems its implementation is buggy. Its use is discouraged.

On  many  systems  alloca()  cannot  be used inside the list of arguments of a function call, because the stack space reserved by alloca() would appear on the stack in the middle of the space  for  the  function arguments.

Ещё есть желающие пользоваться этой функцией? smile

Добавлено через 5 минут
Цитата(Fazil6 @  3.1.2008,  17:48 Найти цитируемый пост)
то четко разделить C и С++

это, имхо, можно обсудить, в виду различия подходов и реализации. На две разные статьи.

Цитата(Fazil6 @  3.1.2008,  17:48 Найти цитируемый пост)
так и не понял почему рассмотрение началось с функции realloc , а не calloc

согласен, можно бы поменять порядок

Цитата(Fazil6 @  3.1.2008,  17:48 Найти цитируемый пост)
malloc, calloc - выделение памяти

++. стоит упомянуть о различиях.

Автор: Alexeis 3.1.2008, 18:39
Цитата(archimed7592 @  3.1.2008,  16:48 Найти цитируемый пост)
Давай ты сейчас скажешь, что ты пошутил, ладно? 

  Да нет, я смотрел код ассемблера, ну пусть инлайн, не макрос, один фик.  

Цитата(JackYF @  3.1.2008,  16:53 Найти цитируемый пост)
Ещё есть желающие пользоваться этой функцией?

Канеш, оптимизировать так оптимизировать! 
  Можно при помощи него оптимизировать работу с строками. Строки в своем большинстве короткие, в куче выделяются медленно, если использовать строку фиксированного размера байтов эдак 200 то всегда есть шанс переполниться на 201 байте  smile , а если рекурсия то чего нам сэкономит память 20000 вызов по ~15 байт или 20000 вызов по килобайту (так чтобы с запасом)  smile ?

  Лан это все оффтоп конечно, но ИМХО функция рулез, хоть и опасная (разве С сам по себе безопасен?)

Автор: JackYF 3.1.2008, 19:27
Цитата(Alexeis @  3.1.2008,  18:39 Найти цитируемый пост)
но ИМХО функция рулез

я извиняюсь... о! придумал! я сейчас создам опрос. Мне просто чисто интересно. Ждите на первом канале в общих вопросах smile

Автор: archimed7592 3.1.2008, 20:40
Цитата(Alexeis @  3.1.2008,  18:39 Найти цитируемый пост)
Да нет, я смотрел код ассемблера, ну пусть инлайн, не макрос, один фик.  

Цитата(JackYF @  3.1.2008,  17:43 Найти цитируемый пост)
$ man alloca
No manual entry for alloca

Видишь ли, точка входа здесь не при чём smile.
Переводится как "нет справки для alloca", т.е. не все *nix системы знают об этой ф-ции smile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)