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

Как узнать размер доступного стекового пространства?

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

И я сделал это, и я получил просто огромный адрес <0x000000dc9354f540>= <947364623680>мы знаем, что этот стек растет вниз, и мы знаем, что мы не можем опуститься ниже 0.
так немного математики:

Я тестирую его и, очевидно, получаю исключение переполнения стека после выделения дополнительных 2 МБ в стеке:

И вот мой вопрос пришел WTF это, и как я могу получить мой фактический размер стека?

Решение

Поскольку у вашего вопроса есть тег «visual-studio-debugging», я предполагаю, что вы используете windows.

Сначала вы должны получить текущий указатель стека. Либо получить адрес локальной фиктивной переменной (как вы сделали сейчас), либо по raw asm читать esp/rsp или получить адрес локальной фиктивной переменной (как вы это сделали сейчас) или получить регистр ЦП через вызов Win32 API GetThreadContext ).

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

Это не имеет никакого отношения к «стеку на вашем компьютере». Это о виртуальный адресное пространство, которое не имеет ничего общего с физическим хранилищем (ОЗУ + файлы подкачки), доступным в системе.

Источник

Получить размер стека и установить размер стека атрибута потока в C

// получить размер стека

int pthread_attr_getstacksize( const pthread_attr_t* restrict attr,

size_t * restrict stacksize);

// установить размер стека

int pthread_attr_setstacksize(pthread_attr_t* attr, size_t stacksize);

,
pthread_attr_getstacksize ():
Используется для получения размера стека потоков. Атрибут stacksize дает минимальный размер стека, выделенный стеку потоков. При успешном запуске это дает 0, иначе дает любое значение.

Читайте также:  дуплексное сканирование вен и артерий нижних конечностей в чем разница

Первый аргумент — принимает атрибут pthread.
Второй аргумент — принимает переменную и дает размер атрибута потока.

pthread_attr_setstacksize ():
Используется для установки размера стека новых потоков. Атрибут stacksize дает минимальный размер стека, выделенный стеку потоков. При успешном запуске он дает 0 в противном случае, если ошибка дает какое-либо значение.

Первый аргумент — принимает атрибут pthread.
Второй аргумент — принимает размер нового стека (в байтах)

#include
#include
#include

// for принимает размер стека потоков

// он получает размер стека потоков и дает

// значение в переменной stksize

// выводим текущий размер стека потоков

// затем устанавливаем размер стека новых потоков

// выводим новый размер стека

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Источник

как определить размер стека потока (имеется специальная функция, библиотека pthread)

Друзья! Какой день воюю со стандартом POSIX
Итак, надо получить размер стека потока. Тупо.

1)Для этого существует функция

Но, во-первых, получается херь какая-то- я сам устанавливаю размер стека, с тем, чтобы его получить. Гениально. А во вторых, и это главное, поток спокойно выполняется с размером стека равным 0. Это выше моего понимания.

Но мы можем объявить поток безо всякой переменной attr! И тогда там создастя стек с размером ПО УМОЛЧАНИЮ! Как его найти? Покрыто мраком всё. А вот простой корректный код и как найти размер стека без того, чтобы самому НЕ ОБЪЯВЛЯТЬ ЕГО- я ума не приложу. Меж тем код работает, стек то есть существует.

Спасибо, кто откликнется

Добавлено через 9 часов 12 минут
подымаю тему в связи с большой общественной значимостью.

Pthread функция потока внутри класса
Нужно чтобы функция pthread_create принимала на входе функцию-член класса, в котором я вызываю.

Как узнать, что поток закончился (библиотека pthread)?
Друзья! Есть ли какая-нибудь pthread-функция, которая вызывается в основном потоке X и показывает-.

Читайте также:  как узнать размер плода при беременности

Определить адрес начала стека потока
Приветствую! Суть задачи такова: для любого потока нужно уметь найти адрес его стека и размер.

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Приоритет потока (pthread)
Доброго времени суток! Есть такой код:#include

библиотека pthread.h в Code::Blocks
не могу найти как подключить библиотеку pthread.h в Code::Blocks. Помогите,пожалуйста, кто знает.

Изолирование данных родительского потока от дочернего в pthread
Сабж. Как сделать так, что бы в дочернем потоке не были видны данные родительского потока? Для.

Специальная функция
Подскажите бесконечную простую функцию как синус и т.д. Чтобы кривая была гладкая и похожа на эту.

Источник

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

Можно ли из проги на С++ узнать размер стека? Просто нужно реализовать рекурсивные вычисления, и узнать насколько глубоко может зайти рекурсивная функция.

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

Re: Как узнать размер стека?

Re: Как узнать размер стека?

Если более точно, то около min(getrlimit(RLIMIT_STACK)+getrlimit(RLIMIT_DATA), getrlimit(RLIMIT_AS)).

Реально чуть меньше, т.к. часть памяти уже занята.

Re: Re: Как узнать размер стека?

Правда, для нитевого стека это всё не годится.
В этом случае можно поковырять как-нибудь так:

register unsigned long esp asm(«esp»);
И далее ковырять /proc/self/maps на предмет размера карты.

Правда, это не переносимо 🙁

Re: Re: Re: Как узнать размер стека?

Хотя вот для POSIX Threads есть pthread_attr_getstacksize/pthread_attr_setstacksize.

По-моему, эти pthread_attr_getstacksize/setstacksize возвращают не совсем то. Как узнать attr для треда?

Для библиотеки GNU C: #include

Размер общей памяти, использованной текущим процессом под стек
находится в элементе long ru_isrss структуры rusage,
заполняемой ф-ей int getrusage(int who, struct rusage* res);
где who = RUSAGE_SELF

Мягкий/жесткий предел размера стека
находится в элементе rlim_t rlim_cur/rlim_max структуры rlimit,
заполняемой ф-ей int getrlimit(int what, struct rlimit* res);
где what = RLIMIT_STACK

Re: Re:

>По-моему, эти pthread_attr_getstacksize/setstacksize возвращают не совсем то. Как узнать attr для треда? Почему не то? По-моему как раз то.

Читайте также:  как узнать баланс карты бинбанка

Атрибут для нити ты сам создаешь pthread_attr_init (post factum не знаю). После этого ты можешь вытянуть либо default stack size через getstacksize или установить свой через setstacksize.

Источник

Стек (stack) в C++: легко и просто!

Всем привет! Сегодня мы разберем структуру данных, которая часто используется для решения задач или для оптимизации программ. Все когда-то в программировании слышали такое слово как стек.

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

Что такое стек и как он работает

В стеке элемент, который вошел самый первый — выйдет самым последним. Получается, если вы добавили три элемента в стек первым будет удален последний добавленный элемент.
На рисунке 1 вы можете увидеть 6 чисел: 6, 5, 1, 2, 5, 9. Кстати извлекать их будем в таком же порядке. Например чтобы извлечь число 1 нам придется сначала извлечь числа 6 и 5, а потом уже 1. Так как это стек, эти числа мы добавляли в обратном порядке. Если быть точным вот так: 9, 5, 2, 1, 5, 6.

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

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

Но все достоинство шаблонного стека заключается в добавлении и удалении элементов. Эти операции происходят за константное время (это хороший плюс).

Кстати некоторые программисты делают стек на массивах. О таком способе использования стека мы поговорим чуть позже.

Как создать стек в C++

Чтобы создать стек нам понадобится оперировать схемой ниже:

Источник

Советы мастера