Существует ли распределитель, который использует alloca и в противном случае совместим с C ++ STL? - PullRequest
10 голосов
/ 03 ноября 2010

У меня два вопроса:

1) Можно ли реализовать распределитель, который использует alloca для выделения памяти в стеке и в противном случае совместим с C ++ STL?

Если там есть код, вы можете сделать меня счастливым, просто указав мне ссылку. :-) Если там нет кода, может быть, вы можете набросать функции выделения и освобождения функций?

2) Если ответ на поставленный выше вопрос - «да», я бы хотел понять, как можно выделить память в стеке для учеников. В качестве примера рассмотрим

std::vector<int, AllocaAllocator<int> > 

и предположим, что вызов функции-члена «resize» этого вектора вызывает сначала «освобождение», а затем «распределение» распределителя.

Область, из которой вызывается allocate, является областью действия функции-члена resize. Не означает ли это, что выделенная память удаляется из стека в конце вызова этой функции?

С уважением, Бьорн

Ответы [ 2 ]

5 голосов
/ 26 ноября 2010

Бьорн, похоже, вы в корне не понимаете, как работают стеки и ресурсы. Читайте о них.

То, что вы спрашиваете, невозможно, поскольку память, выделенная alloca, «освобождается», когда вы возвращаетесь из функции, которая ее выделила (и, в отличие от Патрика, вставка не может изменить ее поведение). Я пишу «освобожден», потому что он на самом деле не освобожден, он просто выходит из области видимости, как любая другая переменная стека. Таким образом, последующее его использование приводит к неопределенному поведению.

Предположим, вы выделяете кусок памяти в YourAllocator::allocate, который вызывается из d.push_back():

deque<int, AllocaAllocator> d;
d.push_back(42); // calls alloca
printf("Hello\n");
printf("%d\n", d[0]);

Память, выделенная alloca, может быть перезаписана стековыми кадрами push_back и printf, поэтому на выходе может не быть 42, это может привести к сбою или любой другой вещи.

3 голосов
/ 14 декабря 2010

Нет, такого рода вещи невозможны. Для начала STL ожидает выделить больше памяти, а затем освободить старую память. Как ты собираешься делать это в стеке?

Единственное, что даже отдаленно эквивалентно этому, - консервативный сборщик мусора.

...