Ограничение размера стека означает, что я могу получить только ограниченные указатели на объекты в куче?

если размер стека составляет 1 МБ, означает ли это, что я могу получить только менее 1000000/8 указателей для распределения целых чисел в куче? (учитывая свободный стек в 1 МБ) да, я знаю, что вы, возможно, не захотите создавать так много отдельных целых чисел в куче, но все же это ограничивает количество объектов, которые вы можете динамически выделить.

разве это не делает целые числа в стеке лучшим выбором? (целые числа здесь имеют размер 4 байта)

редактировать: я получаю комментарии о том, что такое использование указателей, это не то, о чем я спрашиваю, я имел в виду, что при ограниченном размере стека не существует ли ограниченного «количества», а не «размера» вещей, к которым вы можете получить доступ/сделать в куче?

Под «если размер кучи составляет 1 МБ», я полагаю, вы имели в виду «если размер стека составляет 1 МБ»? Пожалуйста, отредактируйте свой вопрос, чтобы исправить возможные опечатки и другие проблемы, которые могут возникнуть.

Some programmer dude 18.04.2024 22:23

А если вы имеете в виду стек, то вызовы компилятора и функций, ведущие к функции main, будут хранить другие данные в стеке, поэтому доступно менее одного МиБ. При этом то, что останется, можно использовать для заполнения локальными переменными, а если это указатели, то в 64-битной системе каждый указатель будет использовать восемь байт. Так что ваш расчет примерно верен. Однако, куда именно указывают все эти указатели, совершенно не имеет значения. Они могут указывать на кучу, стек или другие данные (например, глобальные переменные) и т. д.

Some programmer dude 18.04.2024 22:26

да, спасибо, что указали на опечатку, и да, я знаю о других вещах, занимающих стек, поэтому я сказал (учитывая свободный стек в 1 МБ). да, не имеет значения, на что они указывают, я просто хотел сказать, что могу динамически создавать только ограниченное количество «вещей» в куче, создавая указатели в стеке

Nemexia 18.04.2024 22:28

Когда вы выделяете массив, у вас есть 1 указатель на массив. Не отдельный указатель на каждый отдельный элемент.

drescherjm 18.04.2024 22:29

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

Some programmer dude 18.04.2024 22:29

@drescherjm, да, в этом случае я могу создавать только ограниченное количество «массивов», причем ограничением является размер стека

Nemexia 18.04.2024 22:32

К вашему сведению, указатели не ограничиваются элементами в куче. Во встраиваемых системах мы используем указатели для доступа к аппаратным устройствам, например к драйверу USB.

Thomas Matthews 18.04.2024 22:33

Вы можете выделить объект в куче, и этот объект может иметь столько динамически выделенных объектов, сколько может поместиться в пространстве виртуальной памяти вашего процесса, поэтому ограничение стека в этом примере не применяется.

drescherjm 18.04.2024 22:35

По умолчанию стек может составлять 1 МБ. Ничто не мешает вам изменить настройки по умолчанию для программы, которой требуется больше места. Почему размер стековой памяти настолько ограничен?

BoP 18.04.2024 22:44

К вашему сведению, существуют компиляторы и операционные системы, которые организуют память так, что стек находится на одном конце, а куча — на другом. Они «прирастают» друг к другу. Таким образом, вы можете иметь огромный стек, рискуя получить минимальную кучу.

Thomas Matthews 18.04.2024 23:00

Возможно, путаница в том, что ОП (правильно) считает, что результат каждого динамического распределения должен где-то храниться; эти результаты не связаны между собой и не могут быть упрощены до арифметики указателей. Затем, если вы хотите сохранить результаты в стеке, вам действительно придется уместиться в доступное пространство стека. Конечно, вы можете сохранить результаты где-нибудь еще.

Kerrek SB 19.04.2024 13:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
102
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В стеке может быть один указатель, указывающий на диапазон указателей в куче. Каждый из этих указателей, в свою очередь, может указывать на разные места в куче. Так что практически нет.

Ответ принят как подходящий

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

Например:

int *ptr1 = (int*) malloc(sizeof(int) * N);
int *ptr2 = (int*) malloc(sizeof(int) * M);

ptr1 и ptr2 — это локальные переменные, созданные в стеке, но они указывают на динамическую память, выделенную в куче. Размер стека не влияет на то, сколько места находится в куче:

   Stack                     Heap
+-----------+           +-------------+
|           |           |             |
| +------+  |           |  +--------+ |
| | ptr1 | -|-----------|->| 12345  | |
| +------+  |           |  +--------+ |
| +------+  |           |  | 67890  | |
| | ptr2 | -|-----+     |  +--------+ |
| +------+  |     |     |  | ...    | |
|           |     |     |  +--------+ |
+-----------+     |     |             |
                  |     |  +--------+ |
                  +-----|->| 12345  | |
                        |  +--------+ |
                        |  | 67890  | |
                        |  +--------+ |
                        |  | ...    | |
                        |  +--------+ |
                        |             |
                        +-------------+

Кажется, вы предполагаете, что наличие небольшого стека означает, что в куче может быть только X указателей. Это неправда. Например, указатель можно переместить из стека в элемент объекта, существующий в куче:

   Stack                     Heap
+-----------+           +-------------+
|           |           |             |
| +------+  |           |  +--------+ |
| | ptr1 | -|-----------|->| member | -----+
| +------+  |           |  +--------+ |    |
| +------+  |           |             |    |
| | ptr2 | -|-----+     |  +--------+ |    |
| +------+  |     |     |  | 12345  | <----+
|           |     |     |  +--------+ |
+-----------+     |     |  | 67890  | |
                  |     |  +--------+ |
                  |     |  | ...    | |
                  |     |  +--------+ |
                  |     |             |
                  |     |  +--------+ |
                  +-----|->| 12345  | |
                        |  +--------+ |
                        |  | 67890  | |
                        |  +--------+ |
                        |  | ...    | |
                        |  +--------+ |
                        |             |
                        +-------------+

Я считаю, что путаница вращается вокруг предположения, что каждое распределение кучи выделяет 1 объект и имеет 1 указатель в стеке. Поэтому устанавливается верхнее ограничение на общее количество выделений. Этот ответ можно было бы дополнить, пояснив, что оба эти предположения ложны.

Mooing Duck 18.04.2024 23:11

Другие вопросы по теме