powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись в стек или в кучу - что быстрее?
25 сообщений из 27, страница 1 из 2
Запись в стек или в кучу - что быстрее?
    #38583301
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ясно, что выделить память в стеке не стоит ничего, а в куче - затратно.
Более того, при записи в кучу менеджер памяти ОС постоянно на нервах
- выделенная память ещё не факт, что доступна физически, со стековой памяти
менеджеру памяти работать проще (про наличие разницы между разными ОС - в курсе).

А если предположить, что мы выделили память на куче,
а потом в цикле осуществили запись во все её ячейки,
то есть заставили все страницы присутствовать в ОЗУ.
В этом случае как отличается цена записи в стек и в кучу?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void test()
{
    char buff_s[ 1024*1024 ]; // stack buffer

    char *buff_h = new char[ 1024*1024 ]; // heap buffer
    memset( buff_h, 0, 1024*1024);        // VIRT -> RES


   // Which one is cheaper?
   buff_s[ 555 ] = 5;    // 1
   buff_h[ 555 ] = 5;    // 2
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583302
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ну естественно "и почему" тоже следовало бы добавить к вопросу.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583318
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoестественно "и почему" тоже следовало бы добавить к вопросу.
И к ответу тоже: почему, собственно, ты думаешь, что для ОСи адресное пространство,
занимаемое стэком, как-то отличается от занимаемого кучей?.. Менеджер памяти пометил
блок/страницу как занятую и ему совершенно пофиг кто, как и зачем к ней обращается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583319
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сразу предупрежу: могу ошибаться в своих домыслах. Исходники ОС не изучал.

1. Менеджер памяти напрягается только когда идет обращение по адресу под которым нет реальной памяти.
2. Менеджеру памяти без разницы под что выделена память. В обоих случаях если реальной памяти не хватает - она пойдет в своп.
3. Вероятность похода в своп стека ниже, т.к. он используется интенсивнее. Также выше вероятность что память из стека используется повторно, т.е. уже выделена реальная память.

Вывод: если реальной памяти полно - одинаково, если не хватает - стек предпочтительнее.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583329
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovvilerenkoестественно "и почему" тоже следовало бы добавить к вопросу.
И к ответу тоже: почему, собственно, ты думаешь, что для ОСи адресное пространство,
занимаемое стэком, как-то отличается от занимаемого кучей?.. Менеджер памяти пометил
блок/страницу как занятую и ему совершенно пофиг кто, как и зачем к ней обращается.

Мне кажется, на уровне менеджера памяти стоит тупая проверка: если это стек, используется отдельный простой алгоритм работы с ним. Я думаю, что стеку делается такая честь потому, что обычно он меньше, обычно самая используемая часть - по этим двум причинам можно вообще забить на выгрузку его на диск и как-нибудь упростить алгоритм трансляции страниц из виртуальных адресов в физические...
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583340
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenko,

Никто отдельно стек не обрабатывает.
За ненадобностью.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583343
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoМне кажется, на уровне менеджера памяти стоит тупая проверка: если это стек, используется отдельный простой алгоритм работы с ним.
У каждого потока свой стек, размер которого задается при запуске и причем размер с запасом, т.е. далеко не 100% запрошенного потребуется. Зачем менеджеру памяти под стек держать реальную память которая не будет никогда задействована?
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583397
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoМне кажется, на уровне менеджера памяти стоит тупая проверка: если это
стек, используется отдельный простой алгоритм работы с ним.
Ага, остаётся только нафантазировать какой телепатией он должен обладать, чтобы
определить, что вот эти 4 кб адресного пространства - стэк.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583414
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, я конечно гонзалес без чтения исходников ОС... Это была тупая, но гордая и смелая гипотеза!
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583415
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoя конечно гонзалес без чтения исходников ОС...
Да при чём тут исходники ОС?.. Достаточно элементарного знания о процессоре, его регистрах
(хотя бы одном SP) и отношениях с ОЗУ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583419
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Достаточно элементарного знания о процессоре Явная глупость
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583468
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoЯсно, что выделить память в стеке не стоит ничего, а в куче - затратно.

Не всегда всё так просто.
По крайней мере не всегда выделять в куче так уж затратно.

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

А чем стековая память так уж отличается в этом смысле от кучи ? Тут как раз они одинаковы.

vilerenkoА если предположить, что мы выделили память на куче,
а потом в цикле осуществили запись во все её ячейки,
то есть заставили все страницы присутствовать в ОЗУ.
В этом случае как отличается цена записи в стек и в кучу?


Неизвестно...

Все учёные С++ мужи до сих пор ломают головы над этой проблемой, но ничего не могут сказать,
Но у них есть надежда, что всё-таки запись в память имеет одинаковую стоимость, если конечно
не учитывать такие вещи, как NUMA.
Ведь физически это всё же одна и та же память.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583469
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovvilerenkoМне кажется, на уровне менеджера памяти стоит тупая проверка: если это
стек, используется отдельный простой алгоритм работы с ним.
Ага, остаётся только нафантазировать какой телепатией он должен обладать, чтобы
определить, что вот эти 4 кб адресного пространства - стэк.


Ну, тут не надо сильно напрягаться.
Обращение идёт через stack pointer. Это если Intel, естественно.
Кажется и сегментные регистры/регистры дескрипторов были под стек отдельные.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583493
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoЯсно, что выделить память в стеке не стоит ничего, а в куче - затратно.
В общем случае, это не верно.
Но чаще всего это верно.

vilerenkoА если предположить, что мы выделили память на куче,
а потом в цикле осуществили запись во все её ячейки,
то есть заставили все страницы присутствовать в ОЗУ.Ну так уж прямо и "заставили". Если физической памяти не хватает, то как только ты начинаешь работать с новой страницей, одна из старых уходит в свап. А принадлежит эта страница куче или стеку совершенно не важно.

vilerenkoВ этом случае как отличается цена записи в стек и в кучу?Никак не отличается. Менеджеру памяти совершенно до лампочки что у тебя в конкретной странице находится. Куча, стек, код или константы. С точки зрения МП страница принадлежит процессу или не принадлежит, к ней обращались давно или недавно. И все.

MasterZivDimitry Sibiryakovпропущено...

Ага, остаётся только нафантазировать какой телепатией он должен обладать, чтобы
определить, что вот эти 4 кб адресного пространства - стэк.


Ну, тут не надо сильно напрягаться.
Обращение идёт через stack pointer. Это если Intel, естественно.
Кажется и сегментные регистры/регистры дескрипторов были под стек отдельные.Почему были? Они и сейчас есть.
Стек всегда доступен по SS:ESP и SS:EBP.
Другое дело что на стоимость доступа к памяти это никак не влияет.
А на других семействах (да и на 64-х битных потомках x86) уже нету такой четкой типизации регистров. Там уже действительно менеджер памяти должен обладать телепатией чтобы узнать какая страница содержит стек а какая кучу.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583494
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlТам уже действительно менеджер памяти должен обладать телепатией чтобы узнать какая страница содержит стек а какая кучу.
какой телепатией? о чём вы?
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583496
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилWhite OwlТам уже действительно менеджер памяти должен обладать телепатией чтобы узнать какая страница содержит стек а какая кучу.
какой телепатией? о чём вы?шоб знать что "здесь" у нас стек и поэтому данную страницу ни в коем случае нельзя отправлять в своп.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583500
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlшоб знать что "здесь" у нас стек и поэтому данную страницу ни в коем случае нельзя отправлять в своп.
и? менеджеру память неизвестно распределение адресного пространства под стэки и кучи?
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583751
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилWhite Owlшоб знать что "здесь" у нас стек и поэтому данную страницу ни в коем случае нельзя отправлять в своп.
и? менеджеру память неизвестно распределение адресного пространства под стэки и кучи?
Неизвестно, ведь стек - понятие уровня приложения, выстраиваемое компилятором и загрузчиком. Можно запилить такой загрузчег и такую парадигму программирования, где стека существовать не будет. Менеджеру памяти различать стек и кучу надобности нет, видимо.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583819
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoстек - понятие уровня приложения, выстраиваемое компилятором и
загрузчиком. Можно запилить такой загрузчег и такую парадигму программирования, где стека
существовать не будет.
Да проще всё: присвоить SP любое значение и по этому адресу будет новый стэк, о котором ни
компилятор ни загрузчик не знают ничего.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583877
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovvilerenkoстек - понятие уровня приложения, выстраиваемое компилятором и
загрузчиком. Можно запилить такой загрузчег и такую парадигму программирования, где стека
существовать не будет.
Да проще всё: присвоить SP любое значение и по этому адресу будет новый стэк, о котором ни
компилятор ни загрузчик не знают ничего.

+1
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38583937
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoМожно запилить такой загрузчег и такую парадигму программирования, где стека существовать не будет
Можно для начала свой рантайм запилиь, ОС запилить, да и процессор свой не помешает.
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38584452
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vilerenkoведь стек - понятие уровня приложения, выстраиваемое компилятором и загрузчиком.Это не совсем верно.
Некоторые процессоры "знают" что такое стек и имеют специальные средства (спец-регистры и команды) для работы со стеком.
Другие процессоры ничего не знают о стеках и на них компилятор эмулирует стек через обычные косвенные обращения к памяти.
Пример первых - семейство Intel начиная с i4040 и вплоть до Pentium IV. Пример вторых - практически все процессоры от Motorolla.
Нынешнее семейство Intel Core и его кузены от AMD это "пограничное состояние" У них есть команды на работу со стеком, и есть специальные регистры управляемые этими командами, но эти регистры так же могут быть использованы и для всех остальных команд и являются регистрами общего назначения.

vilerenko Можно запилить такой загрузчег и такую парадигму программирования, где стека существовать не будет. Менеджеру памяти различать стек и кучу надобности нет, видимо.И "Да" и "Нет". Да - если мы будем говорить о каких-то других языках. Нет - если ты используешь С или С++ то без стека обойтись не сможешь. Некоторые особенности этих языков подразумевают использование стека на уровне машинного языка.

Посмотри в словаре слово "загрузчик".
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38584459
vilerenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlvilerenkoведь стек - понятие уровня приложения, выстраиваемое компилятором и загрузчиком.Это не совсем верно.
Некоторые процессоры "знают" что такое стек и имеют специальные средства (спец-регистры и команды) для работы со стеком.
Другие процессоры ничего не знают о стеках и на них компилятор эмулирует стек через обычные косвенные обращения к памяти.
Пример первых - семейство Intel начиная с i4040 и вплоть до Pentium IV. Пример вторых - практически все процессоры от Motorolla.
Нынешнее семейство Intel Core и его кузены от AMD это "пограничное состояние" У них есть команды на работу со стеком, и есть специальные регистры управляемые этими командами, но эти регистры так же могут быть использованы и для всех остальных команд и являются регистрами общего назначения.

vilerenko Можно запилить такой загрузчег и такую парадигму программирования, где стека существовать не будет. Менеджеру памяти различать стек и кучу надобности нет, видимо.И "Да" и "Нет". Да - если мы будем говорить о каких-то других языках. Нет - если ты используешь С или С++ то без стека обойтись не сможешь. Некоторые особенности этих языков подразумевают использование стека на уровне машинного языка.

Посмотри в словаре слово "загрузчик".
Это всё понятно )
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38584482
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНет - если ты используешь С или С++ то без стека обойтись не сможешь.
в System/360 и потомках аппаратного стека нет, есть соглашения об использовании регистров
...
Рейтинг: 0 / 0
Запись в стек или в кучу - что быстрее?
    #38584514
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв System/360 и потомках аппаратного стека нет, есть соглашения об
использовании регистров
Ну если так считать, то вообще нигде аппаратного стэка нет, просто команды CALL-RET
используют один договорной регистр как указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Запись в стек или в кучу - что быстрее?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]