Russian Qt Forum
Ноябрь 27, 2024, 06:18 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

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

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

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

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

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

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

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

Сообщений: 5876


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


Просмотр профиля 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.212 секунд. Запросов: 23.