создавать объект в куче или стеке?
От: Alex Dav Россия  
Дата: 21.08.07 04:57
Оценка:
Подскажите в чем плюсы и минусы?
Спасибо.
Re: создавать объект в куче или стеке?
От: dip_2000 Россия  
Дата: 21.08.07 05:26
Оценка:
AD>Подскажите в чем плюсы и минусы?
если коротко и не вдаваясь в дебри то
Стек
1. Очень быстро.
2. Не нужно заботиться о разрушении
3. Не рекомендуется размещать большие объекты. Размещение очень больших невозможно
Куча
1. Значительно медленнее
2. НУЖНО заботиться о разрушении самостоятельно
3. Можно выделять объекты такого размера, какого позволяет память(ОС)

AD>Спасибо.


Re: создавать объект в куче или стеке?
От: Аноним  
Дата: 21.08.07 05:31
Оценка:
Здравствуйте, Alex Dav, Вы писали:

AD>Подскажите в чем плюсы и минусы?


А, что обязательно должны быть плюсы и минусы?
Это просто 2 разных способа.
Скажем объекты, созданные на стеке уничтожаются автоматически
при выходе из блока. Это плюс или минус?
Вопрос в такой поставновке просто не имеет смысла.
Это примерно как просить объяснить преимущества и недостатки яблок перед грушами.
Re[2]: создавать объект в куче или стеке?
От: dip_2000 Россия  
Дата: 21.08.07 05:32
Оценка:
и еще добавлю, что из того что не нужно заботиться о разрушении или нужно следует время жизни — в случае кучи, время жизни произвольно, в случе стека -выход за пределы блока.
Re[3]: создавать объект в куче или стеке?
От: Alex Dav Россия  
Дата: 21.08.07 06:11
Оценка:
Здравствуйте, dip_2000, Вы писали:

_>и еще добавлю, что из того что не нужно заботиться о разрушении или нужно следует время жизни — в случае кучи, время жизни произвольно, в случе стека -выход за пределы блока.


со временем жизни понятно, спасибо. А за счет в стеке создание быстрее? А обращение (по скорости) различается?
Re[2]: создавать объект в куче или стеке?
От: Alex Dav Россия  
Дата: 21.08.07 06:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А, что обязательно должны быть плюсы и минусы?

А>Это просто 2 разных способа.
Вот потому то и должны быть — это не просто два способа, а два принципиально разных

А>Вопрос в такой поставновке просто не имеет смысла.

А в какой? У меня есть объект где его лучше разместить? (так лучше? )))
Re[4]: создавать объект в куче или стеке?
От: Аноним  
Дата: 21.08.07 06:19
Оценка:
Здравствуйте, Alex Dav, Вы писали:

AD>Здравствуйте, dip_2000, Вы писали:


_>>и еще добавлю, что из того что не нужно заботиться о разрушении или нужно следует время жизни — в случае кучи, время жизни произвольно, в случе стека -выход за пределы блока.


AD>А за счет в стеке создание быстрее?

память выделяется несколькими ассемлерными инструкциями против вызова/вызовов системных ф-ций
AD>А обращение (по скорости) различается?
в общем случае нет
Re[5]: создавать объект в куче или стеке?
От: Alex Dav Россия  
Дата: 21.08.07 06:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alex Dav, Вы писали:


AD>>Здравствуйте, dip_2000, Вы писали:


_>>>и еще добавлю, что из того что не нужно заботиться о разрушении или нужно следует время жизни — в случае кучи, время жизни произвольно, в случе стека -выход за пределы блока.


AD>>А за счет в стеке создание быстрее?

А>память выделяется несколькими ассемлерными инструкциями против вызова/вызовов системных ф-ций
AD>>А обращение (по скорости) различается?
А>в общем случае нет

Спасибо.
Re[5]: создавать объект в куче или стеке?
От: Uzumaki Naruto Ниоткуда  
Дата: 21.08.07 06:40
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alex Dav, Вы писали:


AD>>Здравствуйте, dip_2000, Вы писали:


_>>>и еще добавлю, что из того что не нужно заботиться о разрушении или нужно следует время жизни — в случае кучи, время жизни произвольно, в случе стека -выход за пределы блока.


AD>>А за счет в стеке создание быстрее?

А>память выделяется несколькими ассемлерными инструкциями против вызова/вызовов системных ф-ций

Глупость полная.

Работа на стеке осуществляется быстрее, потому что при инициализации процесса сразу выделяется две страницы памяти, после чего при заполнении страницы данными (при подходе к границе) выделяется следующая. Т.е. один раз выделена, много раз используется. При работе с кучей память выделяется под то количество, которое запрашивается (+ техническая информация о блоке памяти) — при этом осуществляется поиск свободного места в текущей памяти.

Re[3]: создавать объект в куче или стеке?
От: Аноним  
Дата: 21.08.07 06:47
Оценка:
Здравствуйте, Alex Dav, Вы писали:

А>>Вопрос в такой поставновке просто не имеет смысла.

AD>А в какой? У меня есть объект где его лучше разместить? (так лучше? )))

Ну можно спросить об особенностях того или иного способа.
А "плюсы" и "минусы" предполагают, что есть ущербность.

Кстати, совсем не уверен, что в стандрате С++ вообще что-то говорится о стеке и куче.
А говорится там о "Automatic storage duration" и "Dynamic storage duration".
Т.е. используются некие абстракции, которые задают разные способы управлением временем жизни объектов.
Никаких тебе стеков и кучей. Что в общем-то правильно.
Re[4]: создавать объект в куче или стеке?
От: Alex Dav Россия  
Дата: 21.08.07 06:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Alex Dav, Вы писали:


А>>>Вопрос в такой поставновке просто не имеет смысла.

AD>>А в какой? У меня есть объект где его лучше разместить? (так лучше? )))

А>Ну можно спросить об особенностях того или иного способа.

А>А "плюсы" и "минусы" предполагают, что есть ущербность.
Возможно именно это я и имел ввиду ))
Re[6]: создавать объект в куче или стеке?
От: machine3000  
Дата: 21.08.07 07:13
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:

UN>Глупость полная.


UN>Работа на стеке осуществляется быстрее, потому что при инициализации процесса сразу выделяется две страницы памяти, после чего при заполнении страницы данными (при подходе к границе) выделяется следующая. Т.е. один раз выделена, много раз используется. При работе с кучей память выделяется под то количество, которое запрашивается (+ техническая информация о блоке памяти) — при этом осуществляется поиск свободного места в текущей памяти.


Чего-то ты тут намешал всё вместе. Виртуальная память что для стека, что для кучи выделяется примерно одинаково: вначале резервируется адресное пространство, по мере обращений, если по каким-то адресам отсутствует физическая страница памяти, она тут же выделяется операционной системой.
Но приложение работает с памятью на другом уровне. Для всех переменных в стеке память выделяется одной ассемблерной командой sub esp,<размер>. Про кучу ты уже написал. Правда реальные пацаны чаще мспользуют аллокаторы и пулы объектов, чтоб не вызывать каждый раз тормозные new и malloc.
Re[3]: создавать объект в куче или стеке?
От: remark Россия http://www.1024cores.net/
Дата: 21.08.07 08:28
Оценка: +2
Здравствуйте, Alex Dav, Вы писали:

AD>У меня есть объект где его лучше разместить?


В рамочку и на стену

Размещать по-умолчанию на стеке, пока не требуется другого.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: создавать объект в куче или стеке?
От: Alex Dav Россия  
Дата: 21.08.07 08:38
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Alex Dav, Вы писали:


AD>>У меня есть объект где его лучше разместить?


R>В рамочку и на стену

А после моего возвращения он все еще будет висеть? А не получу я утечку части стены?

R>Размещать по-умолчанию на стеке, пока не требуется другого.


Спасибо.
Re[7]: создавать объект в куче или стеке?
От: Uzumaki Naruto Ниоткуда  
Дата: 21.08.07 08:41
Оценка: -1
> Для всех переменных в стеке память выделяется одной ассемблерной командой sub esp,<размер>.

sub esp ничего не выделяет, а просто вычитает из esp размер, т.е. сдвигается по уже зарезервированному при инициализации потока стеку... Читайте батенька Рихтера... глава 16.

Re[7]: создавать объект в куче или стеке?
От: Uzumaki Naruto Ниоткуда  
Дата: 21.08.07 08:43
Оценка:
> Правда реальные пацаны чаще мспользуют аллокаторы и пулы объектов, чтоб не вызывать каждый раз тормозные new и malloc.

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

Re[8]: создавать объект в куче или стеке?
От: machine3000  
Дата: 21.08.07 09:13
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:

>> Для всех переменных в стеке память выделяется одной ассемблерной командой sub esp,<размер>.


UN>sub esp ничего не выделяет, а просто вычитает из esp размер, т.е. сдвигается по уже зарезервированному при инициализации потока стеку...

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

UN>Читайте батенька Рихтера... глава 16.

Рихтера я 10 лет назад читал. Наизусть каждую главу учить как-то не счёл нужным.
Re[6]: создавать объект в куче или стеке?
От: Кодт Россия  
Дата: 21.08.07 09:14
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:

AD>>>А за счет в стеке создание быстрее?

А>>память выделяется несколькими ассемлерными инструкциями против вызова/вызовов системных ф-ций

UN>Глупость полная.

Неполная, ибо...

UN>Работа на стеке осуществляется быстрее, потому что при инициализации процесса сразу выделяется две страницы памяти, после чего при заполнении страницы данными (при подходе к границе) выделяется следующая.


Это ты рассказываешь, как сделано в больших виндах. Не забудь про кучу платформ, где механика другая.

UN> Т.е. один раз выделена, много раз используется. При работе с кучей память выделяется под то количество, которое запрашивается (+ техническая информация о блоке памяти) — при этом осуществляется поиск свободного места в текущей памяти.


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

Но в целом, картина получается такая:
— выделение памяти на стеке — это простейшее арифметическое действие, и к тому же не требует синхронизации
— выделение памяти в куче — всегда более затейливо, а если куча не lock-free, то ещё и синхронизировано (добавляем накладные расходы на работу с мьютексом и, потенциально, ожидание в нём)
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[8]: создавать объект в куче или стеке?
От: SuhanovSergey  
Дата: 21.08.07 09:19
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:

>> Для всех переменных в стеке память выделяется одной ассемблерной командой sub esp,<размер>.


UN>sub esp ничего не выделяет, а просто вычитает из esp размер, т.е. сдвигается по уже зарезервированному при инициализации потока стеку... Читайте батенька Рихтера... глава 16.


Если так рассуждать, то и malloc — это тоже обычно просто какая перетасовка указателей, а не вовсе не выделение памяти.
Согласен с machine3000, что вы тут без особой надобности мешаете вместе разноуровневые понятия.
Re[7]: создавать объект в куче или стеке?
От: Sergey Россия  
Дата: 21.08.07 09:57
Оценка:
> Но в целом, картина получается такая:
> — выделение памяти на стеке — это простейшее арифметическое действие, и к тому же не требует синхронизации

Маленькое уточнение — иногда это цикл. Например, если под виндой за раз выделяется более одной страницы. Что впрочем ситуации с дешевизной выделения не меняет.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.