Как узнать размер стека c
Перейти к содержимому

Как узнать размер стека c

  • автор:

Как узнать размер стека c

Класс std::stack представляет стек — структуру данных, которая работает по принципу LIFO (last-in first-out или «последний вошел — первым вышел») — первым всегда извлекается последний добавленный элемент. Стек можно сравнить со стопкой предметов, например, стопкой тарелок — тарелки добавляются сверху, каждая последующая тарелка кладется поверх предыдущей. А если надо взять тарелку, то сначала берется та, которая в самом верху (которую положили самой последней).

Для работы со стеком надо подключать заголовочный файл . Определение пустого стека:

#include #include int main() < std::stackstack; // пустой стек строк >

Размер стека

С помощью функции size() можно получить количество элементов в стеке, а с помощью функции empty() проверить стек на наличие элементов (если возвращается true , то стек пуст):

#include #include int main() < std::stackstack; if(stack.empty()) < std::cout std::cout 

добавление элементов

Для добавления в стек применяется функция push() , в которую передается добавляемый элемент:

#include #include int main() < std::stackstack; // добавляем три элемента stack.push("Tom"); stack.push("Bob"); stack.push("Sam"); std::cout 

Получение элементов

Мы можем получить только самый верхний элемент стека - для этого применяется функция top() :

#include #include int main() < std::stackstack; stack.push("Tom"); stack.push("Bob"); stack.push("Sam"); std::cout 

В данном случае после добавления трех элементов стек будет выглядеть следующим образом:

------- | Sam | ------- | Bob | ------- | Tom | -------

На верхушке стека будет располагаться послдений добавленный элемент. И с помощью функции top() можно получить этот элемент

Удаление элементов

Для удаления элементов применяется функция pop() . Удаление производится в порядке, обратном добавлению:

stack.pop()

Комбинируя эту функцию с функцией top() можно извлечь все элементы стека:

#include #include int main() < std::stackstack; stack.push("Tom"); stack.push("Bob"); stack.push("Sam"); while (!stack.empty()) // пока стек не пуст < std::cout >

В данном случае, пока стек не станет пустым, выводим на консоль верхний (последний добавленный) элемент с помощью функции top и затем извлекаем его с помощью функции pop. Консольный вывод программы:

Sam Bob Tom

Инициализация деком

Стек можно инициализировать другим стеком или деком (двусторонней очередью):

#include #include int main() < std::dequeusers; std::stack stack ; while (!stack.empty()) < std::cout >

/F (Задать размер стека)

Без этого параметра размер стека по умолчанию по умолчанию — 1 МБ. Аргумент number может находиться в десятичной или C-языковой нотации. Аргумент может варьироваться от 1 до максимального размера стека, принятого компоновщиком. Компоновщик округляет указанное значение до ближайшего кратного 4 байта. Пространство между /F и number является необязательным.

Возможно, потребуется увеличить размер стека, если программа получает сообщения стека переполнения во время выполнения.

Вы также можете задать размер стека следующими способами:

  • /STACK Использование параметра компоновщика. Дополнительные сведения см. в разделе /STACK (Выделение стека).
  • Использование EDI ТБ IN в ФАЙЛЕ EXE. Дополнительные сведения см. в справочнике по EDI ТБ IN.

Установка данного параметра компилятора в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
  3. Введите параметр компилятора в поле "Дополнительные параметры ".

Установка данного параметра компилятора программным способом

  • См. раздел AdditionalOptions.

См. также

Обратная связь

Были ли сведения на этой странице полезными?

Обратная связь

Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделе https://aka.ms/ContentUserFeedback.

Отправить и просмотреть отзыв по

определение максимального возможного размера строки в стеке

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

20 дек 2018 в 13:09

Во-первых, содержимое std::string не хранится "в стеке". Во-вторых, сначала надо было бы распечатать значение s.max_size() . Без этого ничего осмысленного сказать нельзя.

20 дек 2018 в 16:44

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

Сначала вам надо было бы распечатать значение max_size() - тогда стало бы понятно, почему не удается выполнить выделение памяти.

Например, в GCC max_size() возвращает 0x7fffffffffffffff , то есть половину диапазона 64-битного целого типа, половину диапазона std::size_t . А это, как известно, максимальный размер объекта/максимальный размер массива/максимальный размер динамически выделяемого блока памяти в GCC (и во многих других реализациях).

Так как блок памяти, который std::string будет пытаться выделять для хранения строки такой длины будет включать дополнительную информацию, неудивительно, что выделение памяти заканчивается безуспешно. Почему авторы станадартной библиотеки GCC не "урезали" величину max_size() соответствующим образом - вопрос к ним. Но формальной ошибки в этом нет, ибо практической возможности создания строки такого размера вам никто не гарантировал.

/STACK (Выделение стека)

Параметр /STACK компоновщика задает размер стека в байтах. Этот параметр используется только при сборке .exe файла. Параметр /STACK игнорируется при применении к .dll файлам.

Значение reserve указывает общее выделение стека в виртуальной памяти. Для компьютеров ARM64, x86 и x64 размер стека по умолчанию составляет 1 МБ.

Значение commit подлежит интерпретации операционной системой. В WindowsRT он указывает объем физической памяти, выделяемой за раз. Зафиксированная виртуальная память приводит к зарезервированию места в файле разбиения на страницы. Более commit высокое значение экономит время, когда приложению требуется больше места в стеке, но увеличивает требования к памяти и, возможно, время запуска. Для компьютеров ARM64, x86 и x64 значение по умолчанию commit равно 4 КБ.

reserve Укажите и commit значения в десятичной или шестнадцатеричной нотации языка C (используйте 0x префикс).

Другим способом задать размер стека является STACKSIZE оператор в файле определения модуля ( .def ). STACKSIZE Переопределяет параметр выделения стека ( /STACK ) при указании обоих. Размер стека можно изменить после .exe создания файла с помощью EDITBIN средства.

Задание данного параметра компоновщика в среде разработки Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
  2. Перейдите на страницу свойств Свойства конфигурации>Компоновщик>Система.
  3. Измените одно из следующих свойств:
    • Размер фиксации стека
    • Размер резерва стека

Задание данного параметра компоновщика программным способом

  1. См. описание свойств StackCommitSize и StackReserveSize.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *