О C/C++ складывают выделение

Это решение использует purrr::accumulate вместо цикла. (На самом деле, accumulate2, так как есть два условия, необходимые для решения, когда переключаться на новую группу: индивидуальные идентификаторы и начало генного индикатора.) 03-23 ​​пакетом представ (v0.2.1) sup>

6
задан Suma 26 March 2009 в 12:45
поделиться

7 ответов

Выделение стека не использует ничего как malloc/free. Это использует часть памяти, названной стопкой программы, которая является просто непрерывным сегментом памяти.

Существует специальный регистр, который хранит вершину стека. То, когда новый объект создается на стеке, вершина повышена, таким образом увеличив стек, когда объект освобожден (выходит из объема), вершина понижена, таким образом уменьшив стек.

При попытке выделить слишком большой объект на стеке или пойти слишком глубоко в рекурсию, то вершина перерастет максимальный позволенный размер стека, и это называют переполнением стека.

Примечание: фактическое направление роста стека (увеличение или уменьшение адресов) будет варьироваться системой, но общее представление является тем же независимо от фактического направления.

25
ответ дан 8 December 2019 в 02:02
поделиться

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

1
ответ дан 8 December 2019 в 02:02
поделиться

Kepp в памяти, что "складывают выделение", является деталью реализации. Нет никакой гарантии, что стек используется для автоматического хранения. Например, универсальные компьютеры типа IBM сведений не сделали (хотя мне говорят, что их более современные машины делают).

1
ответ дан 8 December 2019 в 02:02
поделиться

Выделение стека обычно делается с точки зрения alloca () или неявно компилятором. Хорошо сделанный alloca () только потребует скудного небольшого количества инструкции, и нет никакой стоимости (или даже потребность) для освобождения его, когда Вы сделаны.

Можно передать указатель на память, выделенную alloca () к любой другой функции/методу, которая ожидает указатель. Вы НИКОГДА не должны возвращать указатель, выделенный alloca ().

Вот некоторые преимущества и недостатки к использованию выделения стека.

6
ответ дан 8 December 2019 в 02:02
поделиться

Ответ на Ваш первый вопрос является стопкой номера, не выделяется от "кучи" вообще.

Необходимо читать, Какой и где стек и "куча" сначала для понимания фундаментальных понятий.

17
ответ дан 8 December 2019 в 02:02
поделиться

Здесь существует хороший вопрос:

"как это гарантирует, что нет никакого конфликта между выделением стека и выделением "кучи"?"

Почти во всех реализациях C/C++ существует единственное непрерывное адресное пространство, таким образом, стековая память и память типа "куча" действительно должны сосуществовать в том пространстве.

Хотя каждый раз стек растет и уменьшается, это не сделано с отдельными выделениями "кучи", можно все еще думать о стеке как о единственном большом блоке памяти, выделенной от "кучи". Если стек растет вне границы того блока, то у нас есть переполнение стека (броское название... кто-то должен назвать веб-сайт в честь него).

В многопоточной программе, каждый раз, когда поток запускается, новый стек должен быть выделен для него, и когда поток умирает, стек может быть освобожден. И имело бы смысл для тех блоков целого стека быть выделенным, используя как есть то же управление "кучей", выставленное через malloc/free.

Таким образом - очень приблизительно говорящий - можно думать о стеке, как являющемся типом объекта, который сосуществует в "куче". Целый стек malloc- редактор все в одном идет, когда поток запускает, и затем он подвыделяется от, и затем это добирается free- d сразу.

В Windows Вы можете (если Вам нравится жить опасно), называют те же API виртуальной памяти самим, чтобы узнать о стеке и вынудить виртуальную страницу в нем быть освобожденной.

6
ответ дан 8 December 2019 в 02:02
поделиться

В C и C++, существует два типа 'автоматического' выделения памяти, где объект создается в течение времени жизни вызова функции и 'динамичный', где некоторая память выделяется функцией, обеспеченной временем выполнения.

В подавляющем большинстве реализаций во время выполнения автоматические объекты выделяются с помощью непрерывного стека, обеспеченного операционной системой, когда поток создается. Стек обычно запускается в высоком ценном адресе и постепенно уменьшается размером объекта. Динамические выделения (malloc в C, новом в C++), используют некоторую другую память, которую требуют от операционной системы. Как ОС знает об адресах, которые использует стек, это не выделяет те же адреса динамическим запросам. Поскольку динамическая область не заказана, это часто называют "кучей".

Таким образом, выделение 'стека' не делает malloc/free. Автоматические объекты в C++ называют конструктора и деструктор, но не новыми или удаляют, как новые и удаляют, также имеют код для управления динамической памятью.

5
ответ дан 8 December 2019 в 02:02
поделиться