Здравствуйте, Alex Dav, Вы писали:
AD>Подскажите в чем плюсы и минусы?
Плюсы и минусы — в розетке. Да и там они меняются местами 50 раз в секунду.
Всё зависит от твоих потребностей.
Если тебе нужно время жизни объекта произвольное — то куча, без альтернатив.
Если объекты полиморфные — опять куча. В очень редких случаях можно похимичить с placement new на стеке.
Если объекты большие, и особенно, если функция рекурсивная — снова куча. Чтобы не исчерпать стек.
Если же время жизни "автоматическое" (от входа до выхода из выражения, из блока, из функции), тип известен во время компиляции, и размер небольшой — добро пожаловать на стек.
Здравствуйте, alzt, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
AD>>>А обращение (по скорости) различается? А>>в общем случае нет
A>На мой взгляд у переменных в стеке больше шансов попасть в кеш, следовательно скорость должна быть быстрее.
Может шансов и больше, но скорость, в моем случае, одинаковая. Я проверял.
Когда вы двигаетесь по стеку ничего не выделяется и всегда есть шанс уйти не туда, куда надо... Работа со стеком осуществляется командами push & pop и регистром esp (для x86 платформы) — не морочьте людям голову. Работа со страницами стека осущствляется функциями ядра, точно так же как и с обычной кучей, только механизм другой и часть памяти под стек выделяется при инициализации процесса.
Re[10]: создавать объект в куче или стеке?
От:
Аноним
Дата:
21.08.07 20:53
Оценка:
UN>Когда вы двигаетесь по стеку ничего не выделяется и всегда есть шанс уйти не туда, куда надо... Работа со стеком осуществляется командами push & pop и регистром esp (для x86 платформы) — не морочьте людям голову.
Вообщето так оно и есть. Адресное пространство под стек резервируется единожды при создании потока, и комититься в пределах 1мб по мере необходимости. Освобождение же памяти происходит единожды — при убивании потока (это если конечно самому не освободить себе стек). Стек это нефрагментируемый участок памяти, который резервируется один раз, растет в пределах зарещервированного размера (обычно 1мб), и освобождается при смерти потока.
Создание объекта на стеке это:
sub esp, sizeof(object)
//probe страниц на запись если размер объекта вылазит за размер страницы памяти
mov ecx, esp //а вот и this
call [ecx+constructor_offset]
При этом ядро здесь _может_ дергаться _неявно_ если при обращении память под стек текущего стека начинает нехватать и ядро отращивает потоку стек ловя PAGE_GUARD исключения. Никаких системных вызовов при этом user-mode коду делаьт вообще не нужно.
Убивание объекта на стеке это соответственно:
call [ecx+destructor_offset]
add esp, sizeof(object)
Тут ядро вообще никак не беспокоиться.
Рост стека _может_ происходить только при первом вызове foo();
Создание на куче это обход дерева менеджера кучи процесса, поиск подходяшщего нода-описателя свободного участка памяти, запрос ОС выделить память если таковой не найден, реорганизация структур менеджера кучи.
А я о чем говорю =) Так я и говорю, только я смотрю со сотроны ядра, а они со сотроны процесса — но все равно такты тратятся — так или иначе =)
Re[12]: создавать объект в куче или стеке?
От:
Аноним
Дата:
21.08.07 23:27
Оценка:
А в многопоточном такой же механизм старниц этих, как и однопоточном?
И еще вот вопрос: Если объкт создался в стёке, когда я его тестил, его можно смело создавать в стёке в потоках?
Здравствуйте, Аноним, Вы писали:
А>А в многопоточном такой же механизм старниц этих, как и однопоточном?
Да.
А>И еще вот вопрос: Если объкт создался в стёке, когда я его тестил, его можно смело создавать в стёке в потоках?
Да. У каждого потока свой стек, проблемы могут возникнуть при межпотоковом взаимодействии и при обращении к статическим переменным (общим для всех потоков).
На мой взгляд у переменных в стеке больше шансов попасть в кеш, следовательно скорость должна быть быстрее.
Пётр Седов (ушёл с RSDN)
Re[14]: создавать объект в куче или стеке?
От:
Аноним
Дата:
24.08.07 01:45
Оценка:
Здравствуйте, Uzumaki Naruto, Вы писали:
UN>Да. У каждого потока свой стек, проблемы могут возникнуть при межпотоковом взаимодействии и при обращении к статическим переменным (общим для всех потоков).