Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Результаты опроса: Часто ли вы храните в контейнерах указатели
исключительно указатели 1 5.88%
в основном указатели 6 35.29%
не замарачиваюсь 2 11.76%
в основном объекты 4 23.53%
исключительно объекты 1 5.88%
что еще за контейнеры? 3 17.65%
Голосовавшие: 17. Вы ещё не голосовали в этом опросе

Ответ
 
Опции темы
Старый 15.04.2012, 15:13   #1
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
контейнеры

часто ли вы храните в контейнерах (std::vector, std::list, std::map, etc) объекты. или же вы чаще храните в них указатели на объекты?

опрос открытый.
(Offline)
 
Ответить с цитированием
Старый 15.04.2012, 15:30   #2
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: контейнеры

Только указатели. Зато нету гемора с конструкторами копирования. Еще удобна связка умных указателей и контейнеров. Это мое ИМХО
__________________

(Offline)
 
Ответить с цитированием
Старый 15.04.2012, 15:45   #3
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: контейнеры

Еще удобна связка умных указателей и контейнеров.
особенно auto_ptr

у меня очень редко контейнеры содержат сами объекты. С ходу могу вспомнить только глифы. Т.е. когда в контейнере содержится небольшая структурка, типа
struct Glyph
{
float x,y,dx,dy;
};
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
mr.DIMAS (15.04.2012)
Старый 15.04.2012, 16:07   #4
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: контейнеры

- зависит от задачи;
- стараюсь избегать std контейнеров;

вообще какой-то странный вопрос.
если я храню указатели на объекты, то где тогда находятся сами объекты?
в рандомное время созданы на куче? такого тоже стараюсь избегать, стоит оптимизировать расположения данных, чтобы помочь кэшу процессора.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
ffinder (15.04.2012)
Старый 15.04.2012, 16:35   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: контейнеры

- зависит от задачи;
это понятно
- стараюсь избегать std контейнеров;
это не понятно

вообще какой-то странный вопрос.
просто статистика

если я храню указатели на объекты, то где тогда находятся сами объекты?
в рандомное время созданы на куче
(Offline)
 
Ответить с цитированием
Старый 15.04.2012, 17:48   #6
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: контейнеры

В основном указатели, объекты редко, только если небольшие и для удобства менеджмента (очистка списка убивает и объекты)
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (15.04.2012)
Старый 15.04.2012, 18:00   #7
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: контейнеры

это не понятно
очень плохо себя ведут в мультипоточной обстановке и любят выделять/удалять память когда попало (это и есть главная проблема с мультипоточностью).
например, помню - если сделать вектору reserve, это не гарантирует дальнейшее отсутствие работы с памятью, только при push_back, а если сделать clear, то он все равно вызовет delete по хардкору, и смысл резерва потеряется.
кроме того, очень сложно докапываться до причины бага, когда дебаггер тычет им в недра stl - это кошмарное нагромождение наследований и непонятного кода.
предпочёл написать быдловектор себе по вкусу (задача крайне проста, если не пытаешься угодить всем сразу, а знаешь что тебе нужно) в 1-2 экрана кода, и не парюсь.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (16.04.2012)
Старый 15.04.2012, 18:30   #8
mr.DIMAS
Дэвелопер
 
Аватар для mr.DIMAS
 
Регистрация: 26.12.2006
Адрес: Санкт-Петербург
Сообщений: 1,572
Написано 547 полезных сообщений
(для 1,540 пользователей)
Ответ: контейнеры


Чувствую сейчас опять холивар начнется
__________________

(Offline)
 
Ответить с цитированием
Старый 15.04.2012, 18:33   #9
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: контейнеры

Сообщение от SBJoker Посмотреть сообщение
В основном указатели, объекты редко, только если небольшие и для удобства менеджмента (очистка списка убивает и объекты)
так же.
Контейнер подразумевает динамическое изменение своего содержимого. Как правило, это является следствием того, что сущность-владелец контейнера всего-лишь осуществляет менеджмент некоторых объектов:
1) сущность их не создаёт
2) сущность не удаляет их
3) объекты существуют вне сущности
Ну и почему тогда хранить НЕ указатели? Если же концепция другая, т.е. сущность явно агрегирует в себя сами объекты, то как правило (но не всегда) можно обойтись массивом (в т.ч. динамическим).
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (16.04.2012)
Старый 16.04.2012, 00:29   #10
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: контейнеры

Mr_F_, а как ты решаешь вопросы многопоточности в своем контейнере. не блокировками же? (мютексами или крит. секциями?)
(Offline)
 
Ответить с цитированием
Старый 16.04.2012, 01:08   #11
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: контейнеры

Mr_F_, а как ты решаешь вопросы многопоточности в своем контейнере. не блокировками же? (мютексами или крит. секциями?)
нет, я просто делаю контейнеры, которым обязательно нужно делать reserve перед использованием, после чего они гарантируют отсутствие работы с кучей.
также исключаю insert элемента в абы какое место массива.
дальше остаётся лишь соблюдать правило - 1 поток-писальщик, остальные читальщики.
если нужно менять местами, передвигать элементы массива (не вылезая за его границы), можно иметь дополнительный indirection массив такого же размера, который маппит оригинальные id к новым.

ну это касательно вектора и стринга.
а альтернативу std::map пока не находил и вряд ли напишу удачнее)
так что стараюсь планировать архитектуру так, чтобы им просто не пришлось пользоваться, а если уж никак, то только в одном потоке.

---
+ ещё один камень в огород стл вектора: он не может содержать выравненные данные, типа __declspec(align(16))
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (16.04.2012)
Старый 29.06.2012, 15:07   #12
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: контейнеры

Сообщение от impersonalis Посмотреть сообщение
так же.
Контейнер подразумевает динамическое изменение своего содержимого. Как правило, это является следствием того, что сущность-владелец контейнера всего-лишь осуществляет менеджмент некоторых объектов:
1) сущность их не создаёт
2) сущность не удаляет их
3) объекты существуют вне сущности
Ну и почему тогда хранить НЕ указатели? Если же концепция другая, т.е. сущность явно агрегирует в себя сами объекты, то как правило (но не всегда) можно обойтись массивом (в т.ч. динамическим).
И ещё добавлю:
если и в контейнере хранятся не нативные сущности, то организация усложняется сразу. Если с указателями для помещения экземпляра в контейнер достаточно скопировать его адрес (несколько байт), то здесь:
1) нужно перекопировать весь объект;
2) исходный объект удалить (автоматически);
3) если в объекте есть данные, адресуемые указателем (например, динамические массивы), то, вероятно, придётся писать свою реализацию конструктора копирования.
4) конструктор и деструктор (в случае из п.3) тоже придётся реализовать, даже если объект - структура, хранащая пару строк (char*), а их задание и удаление раньше контролировалось вами (до использования контейнера) вручную.

В общем - кроме экономии капли памяти (на указатель) плюсов для использования в контейнерах не указателей, а самих сложных объектов - не вижу.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (29.06.2012)
Старый 29.06.2012, 16:46   #13
jimon
 
Сообщений: n/a
Ответ: контейнеры

немного схоже с Mr_F_, я не использую STL потому что иногда его нет (читай андроид ndk), у меня всего они самодельный контейнер - const array, перед использованием делаем reserve на количество елементов (делает alloc), а дальше аллоцируем из свободных - request (просто смещает индекс свободного элемента и возвращает указатель), удаления нету, если приспичило есть requestMore (делает realloc) но еще ни разу в игровом коде не понадобилось

в плане использования const array - он везде хранит объекты, если приспичило и структуры имеют переменный размер, то я храню тупо массив байт, в будущем сделаю чтобы несколько const array могли юзать внешний кусок данных, чтобы вообще все игровые данные аллочить за один раз (сейчас у меня всё же несколько аллокаций)

поинтеры хранятся только в тех местах где что-то ссылается на что-то (связи в скриптах которые выставляются в редакторе), но тут система чуть хитрее, в данных уровня (те которые из файла копируются в память) резервируется место под поинтер (собсно разный размер под 32\64 бита выходит), но вместо поинтера пишется индекс из нужного массива, после загрузки уровня игра делает link resolve, те проходится по всем классам (у меня свой RTTI, я знаю какой класс какие поинтеры по каким смещениям имеет), и заменяет индексы на актуальные поинтеры

думаю спросите что насчёт деревьев ? любое дерево можно представить линейно в виде массива, и точка

насчёт map ? бинарный поиск наше всё

насчёт динамических структур ? знаете, а они не нужны !

ps. и да, в игре всего ~50 аллокаций и ~30 живых поинтеров, 1 ВБО ! (хотя с ~50 vao), и всего 2-5 текстур, при этом это не хухры мухры, а полноценная игра с кучей мешей, с кучей скелетки (80+ анимаций), с весьма впечатляющим количеством интерфейсов и тд

Последний раз редактировалось impersonalis, 29.06.2012 в 22:42.
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо за это полезное сообщение:
HolyDel (29.06.2012), Mr_F_ (29.06.2012)
Старый 14.07.2014, 15:07   #14
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: контейнеры

Vector of Objects vs Vector of Pointers Updated
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 23:29.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com