|
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
|
||||||
Есть ли возможность отследить выделение памяти в стеке?24.04.2025, 12:37. Показов 3917. Ответов 16
Метки нет (Все метки)
Добрый день.
Просто стало любопытно, чтобы отследить выделение памяти в куче достаточно перегрузить оператор new. Например вот так
0
|
||||||
| 24.04.2025, 12:37 | |
|
Ответы с готовыми решениями:
16
Выделение памяти на стеке Выделение памяти для массива в стеке Выделение памяти (CodeGear RAD Studio 2009 - C++ builder). Выделение памяти - консоль vs SDIApp |
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 24.04.2025, 13:15 | ||
|
Максимум можно сделать какой-то stack-аллокатор, на основе, например, нестандартной alloca, в который засунуть логирование. Практического смысла в этом мало, впрочем. Если только как академическое развлечение. Что за задача у вас, что вам такое понадобилось?
1
|
||
|
5 / 5 / 0
Регистрация: 28.12.2019
Сообщений: 26
|
|
| 24.04.2025, 13:25 | |
|
Физически нет никакого стэка в CPU. Адреса всех "стэковых" и статических переменных, адреса возврата функций и пр. вычисляются заранее во время компиляции, точнее при запуске без особых ключей - адреса всё время будут разные, вычисляются смещения и после запуска твоей программы (PE-файла под виндой) система автоматом даёт ей память под всё это дело, то есть даёт один раз и только при запуске, т.к. заранее знает сколько нужно памяти, ибо объём статических данных в рантайме не может быть изменён и отследить это "выделение" программно из кода нельзя, т.к. это делает система. Где всё это хранится в реальности - это уже другой вопрос, система сама распихивает эти переменные по регистрам, кешам L1/L2/L3 и общей оперативной памяти накройняк и зависимости от загруженности (других процессов) и объёмов. Отследить это выделение в рантайме нельзя, т.к. количество этих выделений считает сам компилятор.
upd: я не совсем точно всё расписал, на самом деле память под адреса возврата может меняться в рантайме, всё зависит от глубины рекурсии и если перестараешься, схватишь стэковерфлоу. Ещё, если ты используешь экзотику типа _malloca/alloca (см на окончание А), то есть выделяешь память на стэке, тогда размер реально используемой памяти под стэк становится трудно прогнозируемым и ты легко сможешь выскочить за стэк (stackoverflow), но вот именно эти выделения ты сможешь посчитать в рантайме, но зачем? Эти выделения освобождаются при выходе за scope.
1
|
|
|
Вездепух
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
|
||
| 24.04.2025, 18:52 | ||
operator new ситуация в стеке не имеет. Память в стеке выделяется одним блоком сразу в расчете на всю функцию. То есть это совершенно не привязанный к конкретным объектам процесс.Поэтому возникает вопрос: что именно вы хотите отследить? Выделение памяти на входе в функцию? Это несложно: просто следите за положением верхушки стека и все.
1
|
||
|
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
|
|
| 24.04.2025, 19:37 [ТС] | |
|
да собственно нет никакой задачи, просто заполняю пробелы в знаниях.
Вот решил разобраться в аллокаторах. Перегрузка new\delete\malloc\free оказалась не сложной, но вот по ходу пьесы озадачился таким вопросом.
0
|
|
|
Неэпический
|
||
| 25.04.2025, 06:42 | ||
|
3
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 25.04.2025, 08:30 | ||
|
Потому что все вот эти "динамическая память", "стековая память" ("выделение памяти на стеке"), "статическая память" на языке высокого уровня в самом деле выглядят весьма и весьма абстрактно. А когда вы посмотрите как это фактически выглядит на процессоре - прям сразу наступит просветление, потому что там оно просто, понятно и очевидно, т.к. непосредственно своими руками всё это трогаешь. Эх, были времена Z80, когда писание на ассемблере было понятным; ну или хотя бы под DOS. Сейчас под Windows в этом, к сожалению, слишком много магии, вернее прослоек и много приседаний при старте, тратится слишком много сил на мишуру, не имеющую отношения к сути. Есть ли среда (ОС) сейчас на IBM PC такая, чтобы программирование на ассемблере выглядело просто и понятно, при этом максимально близко к железу (для понятности) - не знаю. Может подскажет кто?
1
|
||
|
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
|
|
| 25.04.2025, 11:00 [ТС] | |
|
удивительно, но пару месяцев назад я почитал книгу по NASM, и оказалось что там тоже есть стек
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 25.04.2025, 11:03 | ||
|
В отличии от "динамической памяти", например. Но тогда вы вообще должны отлично понимать что есть стек. Это тот самый стек процессора и есть.
0
|
||
|
Заблокирован
|
|
| 25.04.2025, 11:35 | |
|
0
|
|
|
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
|
|
| 25.04.2025, 12:11 [ТС] | |
|
вы хотите сказать что стек с++ и стек процессора это одно и тоже? как-то слабо вериться
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 25.04.2025, 12:25 | ||
|
Стек процессора (на платформе конкретно x86) - известно что. Как и на других платформах тоже (хотя допускаю, что вероятно есть платформы и процессоры, где нет понятия стек в том же виде, как на x86 архитектуре) В стандарте С++ описано про стековую память, наверняка еще какое-то есть использование термина "стек" (стек вызова процедур, например). Я тут не силен нифига. Но суть в том, что стандарт С++ описывает некую абстрактную машину. и в общем случаи наверняка можно найти места, где понятие "стек" с точки зрения стандарта С++ не будет совпадать с понятием "стек" на процессоре x86. Подозреваю, что в стандарте С++ нет как такового самостоятельного понятия "стек", а есть словосочетания только. Это если придираться и буквоедствовать. Но "по бытовому" - да, это одно и тоже для С++ и x86 процессора. Добавлено через 4 минуты т.е. "переменная на стеке" на x86 платформе будет как раз размещена в том же месте памяти, где и стек процессора, и адрес возврата из процедуры (примерно соответствует "стек вызовов") располагается как раз на стеке процессора, и управляется через процессорные (ассемблерные) команды call и ret Добавлено через 1 минуту Там выше ссылку давали ан хабр там же как раз вот эти все моменты и разжёваны, насколько я понял проглядев по диагонали Anton1978, Вы её прочитали уже?
0
|
||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
|
| 25.04.2025, 12:25 | |
|
Anton1978, на самом деле в самом C++ никакого стека нет. В C++ есть классы хранения (storage duration). Это абстракции над способами хранения, выделенные в четыре категории
* Automatic storage duration * Static storage duration * Thread local storage duration * Dynamic storage duration То, что в обычном бытовом разговоре понимается под "стеком" - это первая категория, объекты с автоматическим классом хранения. Сам стек появляется уже когда компилятор нагенерирует машинный код, в котором будут соответствующие машинные инструкции по изменению стекового регистра процессора.
0
|
|
|
105 / 7 / 1
Регистрация: 27.04.2015
Сообщений: 251
|
|
| 25.04.2025, 12:29 [ТС] | |
|
просто это странно, любая книга по многопоточке утверждает, что у каждого потока есть свой собственный стек и общая для всех куча. Если стек с++ приложения и процессора суть одно и тоже, то сколько же памяти обрабатывает процессор ?
По идее у каждого приложения свой стек это 100500 потоков умножить на 8 мегабайт. Поэтому я всегда был уверен, что на самом деле нет ни стека ни кучи, это все абстракции высоких языков программирования. А NASM просто сделал шаг вперед и создал свою абстракцию. Или я совсем неверно понимаю распределение памяти ? Добавлено через 2 минуты >> Anton1978, Вы её прочитали уже? почитал, но лучше еще раз почитаю завтра, когда отосплюсь
0
|
|
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
|||
| 25.04.2025, 12:37 | |||
|
Т.е. действуют "по-старинке", излагая материал по сути в привязке к конкретной платформе. Ну просто потому, хотя бы, что подавляющее большинство платформ, с которыми придётся столкнуться в жизни, работают именно в таких терминах, а не в абстрактных терминах стандарта. И отладчики тоже работают в "физических" терминах, а не абстрактных из стандарта Добавлено через 2 минуты ![]() Вот туда и утилизируются все эти ненормальные гигабайты, требующийся на компьютерах нынче. Хотя в 48 Кб (включая видеопамять!) умещались не менее увлекательные игры в старые добрые времена
1
|
|||
|
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
|
||
| 25.04.2025, 12:38 | ||
|
1
|
||
|
631 / 526 / 104
Регистрация: 05.08.2022
Сообщений: 2,810
|
||
| 25.04.2025, 12:40 | ||
|
С точки зрения процессора он просто тупо выполняет и выполняет последовательность команд, но ОС переключает его между разными последовательностями при переключении потоков, "подсовывая" команды из разных областей памяти , где хранится код разных потоков (Делает это код ОС путём изменения значения регистра адреса команд процессора)
1
|
||
| 25.04.2025, 12:40 | |
|
Помогаю со студенческими работами здесь
17
Прошу отследить утечку памяти, если оная есть выделение памяти под трехмерный массив с возможностью зануления Как сделать так чтобы при каждом выделении памяти в методе была возможность ее очистить и вернуть результат? Переменные в стеке. Где хранятся? Как обрабатываются? Есть ли программный стек или только стек процессора? Как происходит процесс выделения памяти в стеке и куче Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|