Russian Qt Forum
Июля 01, 2025, 09:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Приватные члены класса: stack или heap?  (Прочитано 5531 раз)
JamS007
Гость
« : Августа 02, 2012, 15:34 »

Приветствую.

Я уже больше пол года ничего не писал на плюсах, очень много нюансов позабыл.  А сейчас вот решил вернуться, и при объявлении очередного класса задался вопросом: как лучше объявить члены класса? На стеке или в куче?

Код
C++ (Qt)
class Foo{
public:
   Bar member;
   // vs
   Bar *member;
}
 
(Bar - класс, а не примитивный тип)

Если я не ошибаюсь, время доступа к объектам на стеке меньше, чем время доступа к объектам в куче, но стек не резиновый, и чем больше в нем объектов тем больше вероятность нарваться на stack overflow.
Также, если мне не изменяет память, в случае, когда экземпляр класса размещен в куче - не важно, как объявлены его члены, они все-равно будут размещены в куче.

В общем, кто как объявляет члены класса? по возможности, аргументируйте, пожалуйста свою позицию.
Спасибо.

P.S. Если уже обсуждалось на форуме, плиз, дайте ссылку.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5877


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Августа 02, 2012, 15:38 »

Если объявляешь на стеке, то должен инклудить в хидер зависимости, что не есть хорошо.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
DmitryM
Гость
« Ответ #2 : Августа 02, 2012, 15:49 »

Если я не ошибаюсь, время доступа к объектам на стеке меньше, чем время доступа к объектам в куче, но стек не резиновый, и чем больше в нем объектов тем больше вероятность нарваться на stack overflow.
А с кучей будет std::bad_alloc.
Записан
JamS007
Гость
« Ответ #3 : Августа 02, 2012, 16:24 »

А с кучей будет std::bad_alloc.

согласен, но размер кучи значительно больше размера стека, что, в свою очередь, уменьшает вероятность возникновения std::bad_alloc.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Августа 02, 2012, 16:38 »

Соображения "что быстрее" и "что больше какой памяти займет" здесь совершенно неуместны. Лучше рассуждать так:
член Bar существует всегда или его может и не быть? В последнем случае указатель. 
Записан
JamS007
Гость
« Ответ #5 : Августа 02, 2012, 23:35 »

Igors, спасибо. Действительно важное замечание, стоящее использования на практике.
Записан
Akon
Гость
« Ответ #6 : Августа 03, 2012, 08:12 »

До кучи: член Bar существует всегда (в пределах Foo) и является базовым классом, т.о. в классе Foo должен содержаться как указатель или ссылка.
Записан
Lagovas
Гость
« Ответ #7 : Августа 15, 2012, 17:52 »

Ссылка является константным указателем автоматически разыменуемый компилятором, как пишет Эккель. Разница между указателем, то, что инициализируется сразу, не может присваиваться другой адрес и он не может быть Null. Т.е. все это гарантирует что там будет что то от начала до конца. Но все же есть разница от константного указателя. Он может инициализироваться адресом на ноль (только что проверил), а значит не факт что там будет что то. Что выбрать решать уже вам, но как по мне, инициализация указателя выглядит красивее чем ссылки. :ptrTypeValue(new Type()) будет красивее в коде, чем инициализация ссылки :refTypeValue(*(new Type())). Но врядли это веский аргумент)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.028 секунд. Запросов: 20.