Динамический массив на стэке
От: Muxa  
Дата: 07.09.11 11:56
Оценка:
Я сейчас глупость спрошу:
Почему нельзя сделать вот так?

void f( int n )
{
   int a[n];
}
Re: Динамический массив на стэке
От: 24  
Дата: 07.09.11 12:06
Оценка: +1 -1 :)
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?

M>
M>void f( int n )
M>{
M>   int a[n];
M>}
M>


В С стандарта 99-го года можно. В С++ впринципе можно шаблонами выкрутиться, как-то так (пишу в браузере):

template <typename T, int SIZE>
class Array {
public:
    T& operator[](int i) {return data[i];}

private:
    T data[SIZE];
}

void f( int n )
{
   Array<int, n> a;
}
Re: Динамический массив на стэке
От: Ops Россия  
Дата: 07.09.11 12:07
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?

M>
M>void f( int n )
M>{
M>   int a[n];
M>}
M>


Вроде в GСС можно (нестандартное расширение). А вообще для этих целей есть alloca.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[2]: Динамический массив на стэке
От: 24  
Дата: 07.09.11 12:09
Оценка: +1
Здравствуйте, 24, Вы писали:

24>В С++ впринципе можно шаблонами выкрутиться, как-то так (пишу в браузере):


С шаблонами так нельзя конечно, видимо я плохо выспался сегодня
Re[3]: Динамический массив на стэке
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 07.09.11 12:12
Оценка:
Здравствуйте, 24, Вы писали:

24>Здравствуйте, 24, Вы писали:


24>>В С++ впринципе можно шаблонами выкрутиться, как-то так (пишу в браузере):


24>С шаблонами так нельзя конечно, видимо я плохо выспался сегодня

если облажался, можно удалить топик как ошибочный.
Sic luceat lux!
Re[4]: Динамический массив на стэке
От: Ops Россия  
Дата: 07.09.11 12:13
Оценка:
Здравствуйте, Kernan, Вы писали:

24>>С шаблонами так нельзя конечно, видимо я плохо выспался сегодня

K>если облажался, можно удалить топик как ошибочный.
Пока на него не ответили...
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re: Динамический массив на стэке
От: panter_dsd Россия panter-dsd.narod.ru
Дата: 07.09.11 12:14
Оценка: +2 :)
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?

M>
M>void f( int n )
M>{
M>   int a[n];
M>}
M>


А зачем, если есть std::vector?
С уважением.
Пантер.
Re[2]: Динамический массив на стэке
От: Sni4ok  
Дата: 07.09.11 12:17
Оценка: +2
Здравствуйте, panter_dsd, Вы писали:

_>А зачем, если есть std::vector?


например затем, что выделение на стеке элементарная мгновенная операция, а выделение памяти под вектор очень дорогая конкурентная операция?
Re: Динамический массив на стэке
От: Анатолий Широков СССР  
Дата: 07.09.11 12:18
Оценка: 4 (1)
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?

Можно в С99:
http://en.wikipedia.org/wiki/Variable-length_array

В С++ же используй alloca для схожих целей:


void foo(size_t size) {
   int* a = new (alloca(size*sizeof(int))) int[size];
   for(size_t i = 0; i < size; i++)
       a[i] = 0;
}
Re[2]: Динамический массив на стэке
От: Sni4ok  
Дата: 07.09.11 12:18
Оценка: +1
Здравствуйте, Ops, Вы писали:

Ops>Вроде в GСС можно (нестандартное расширение). А вообще для этих целей есть alloca.


а alloca по вашему- стандартная функция?
Re[3]: Динамический массив на стэке
От: Ops Россия  
Дата: 07.09.11 12:24
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, Ops, Вы писали:


Ops>>Вроде в GСС можно (нестандартное расширение). А вообще для этих целей есть alloca.


S>а alloca по вашему- стандартная функция?


Нет, но поддерживается большинством компиляторов, в отличие от.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[4]: Динамический массив на стэке
От: Sni4ok  
Дата: 07.09.11 12:33
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Нет, но поддерживается большинством компиляторов, в отличие от.


так то да, а я предпочитаю заведомо большой буфер на стеке выделить- и с ним работать, накладных расходов — никаких, и всё честно
Re[2]: Динамический массив на стэке
От: sysenter  
Дата: 07.09.11 13:20
Оценка:
Здравствуйте, 24, Вы писали:

24>В С стандарта 99-го года можно. В С++ впринципе можно шаблонами выкрутиться, как-то так (пишу в браузере):


C++x11 вроде, как должен поддерживать т.к. совместим с C99.
Re: Динамический массив на стэке
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.09.11 13:23
Оценка: 4 (1) -1
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?

M>
M>void f( int n )
M>{
M>   int a[n];
M>}
M>


В C99 можно. И почти в любом компиляторе можно сделать вот так:

int *a = alloca( n * sizeof(int) );


Суть будет ровно та же самая, только синтаксис не столь приятный.
Re[3]: Динамический массив на стэке
От: sysenter  
Дата: 07.09.11 13:26
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>например затем, что выделение на стеке элементарная мгновенная операция, а выделение памяти под вектор очень дорогая конкурентная операция?


Не такая уж и дорогая. Понятное дело, что дороже чем выделение в стеке, но runtime библиотека имеет свой кеш памяти, чтобы каждый раз у системы не запрашивать, не фрагментировать и не требовать для пары байт целую страницу (4096). Обратно системе runtime библиотека так же возвращает не всю освободивщуюся память.
Re[3]: Динамический массив на стэке
От: Alexey F  
Дата: 07.09.11 13:35
Оценка: 2 (1)
Здравствуйте, sysenter, Вы писали:

24>>В С стандарта 99-го года можно. В С++ впринципе можно шаблонами выкрутиться, как-то так (пишу в браузере):

S>C++x11 вроде, как должен поддерживать т.к. совместим с C99.
Нет, было предложение включить VLA (variable length arrays) в C++11, но данное предложение не прошло.
Re: Динамический массив на стэке
От: Pavel Dvorkin Россия  
Дата: 07.09.11 15:51
Оценка: 5 (2)
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?

M>
M>void f( int n )
M>{
M>   int a[n];
M>}
M>


Причина идеологическая.
В ранних языках (Алгол-60, PL/1) это было можно


begin
integer n;
input(n);
begin
integer array a[1:n];
...


Впоследствии от этой идеи отказались.

За все компляторы и платформы, конечно, не скажу, ограничусь x86. Но, думаю, в других системах то же.

Когда все массивы статические, суммарный объем данных , размещаемых на стеке, при входе в функцию известен до ее выполнения. Поэтому компилятор просто строит код, изменяющий значение регистра стека на суммарный объем. Кстати, по крайней мере VC++ делает это именно при входе в функцию, а не при входе в блок, как вроде бы требовалось. Поэтому в пределах функции значение регистра стека не меняется (конечно, оно изменится, если внутри этой функции войти в другую, но тогда в другой будет то же самое, а выйдем — вернемся в исходное состояние вызываюшей функции). Поэтому адреса всех стековых переменных (и массивов, и скаляров) можно определить в момент входа в функцию и они в ней меняться не будут. В x86 для этого используется базирование по регистру EBP.

Если допустить, что память может внутри функции выделяться на переменный размер, то от этой простой схемы ничего не останется. Придется существенно усложнять код выделения, а значит, упадет скорость. Выгода не перекрывает проблем.
With best regards
Pavel Dvorkin
Re[2]: Динамический массив на стэке
От: Pzz Россия https://github.com/alexpevzner
Дата: 07.09.11 16:03
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Если допустить, что память может внутри функции выделяться на переменный размер, то от этой простой схемы ничего не останется. Придется существенно усложнять код выделения, а значит, упадет скорость. Выгода не перекрывает проблем.


Ой, да ладно. На входе сохраняем указатель стека в другом регистре и декрементируем его по мере надобности (напомню, стек на x86 растет вниз). На выходе восстанавливаем указатель стека из регистра. Команды enter/leave делают это автоматически.
Re: Динамический массив на стэке
От: x-code  
Дата: 07.09.11 16:39
Оценка:
Здравствуйте, Muxa, Вы писали:

M>Я сейчас глупость спрошу:

M>Почему нельзя сделать вот так?
M>
M>void f( int n )
M>{
M>   int a[n];
M>}
M>


А можно я глупый вопрос продолжу?
А почему нельзя как-то вынести на уровень языка динамическое добавление и извлечение объектов из системного стека? Многие алгоритмы таковы, что нужно насоздавать какое-то заранее неизвестное количество объектов из входных данных, и затем их обработать. На асме обычно пишут что-то типа "push eax" и все. А при выходе из фунцкии стек все равно восстанавливается.
Re[3]: Динамический массив на стэке
От: dilmah США  
Дата: 07.09.11 16:43
Оценка: +1
S>например затем, что выделение на стеке элементарная мгновенная операция

с чего это. Там каждой страницы нужно касаться
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.