Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2013, 15:24   #1
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию распределение массива

Здравствуйте.

Есть общая структура для хранения информации о всех объектах, скажем data, в ней содержатся разные переменные и т.п. Необходимо поделить использование структуры на 4 разных группы (предметы, персонажи, и т.п.). Здесь и вопрос, как лучше это сделать? Использовать один массив, с обращением к его областям через указатели, или массив под каждую группу?


data dat[1000];

data *p1 = dat[0];
data *p2 = dat[250];
data *p3 = dat[500];
data *p4 = dat[750];

или

data dat1[250];
data dat2[250];
data dat3[250];
data dat4[250];

С точки зрения целесообразности и производительности, какой вариант для компьютера лучше? Ибо, в плане удобства, в обоих вариантах создается отдельное средство управления (указатель, или персональный массив).
Артэс вне форума Ответить с цитированием
Старый 16.09.2013, 16:10   #2
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
data *p1 = dat[0];
Вы в p1 не адрес помещаете
Igor95 вне форума Ответить с цитированием
Старый 16.09.2013, 21:32   #3
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

&dat[0];

вопрос в силе
Артэс вне форума Ответить с цитированием
Старый 16.09.2013, 21:40   #4
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Ну мне кажется что более экономичный 2 вариант. Просто указатель тоже занимает память и получается:

В первом варианте занимаемая память: sizeof(p1) * 4 + 1000 * sizeof(data)
А во втором: (sizeof(data) * 250) * 4 = sizeof(data) * 1000

Вроде так.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 16.09.2013, 21:46   #5
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Можно ещё чуток поднапрячься и реализовать иерархическую базу данных в виде структуры:
Код:
struct Data{
    struct Data* parent;//указатель на предка
    int dataSize;//размер данных
    byte* data;//данные
    int number_of_childs;//количество потомков
    struct Data** childs;//указатель на массив указателей на потомков или массив указателей на потомков, тогда количество потомков будет статично(последний потомок всегда NULL)
};
С моей точки зрения такое будет более естественно, так как не будет нужды в обходе массивов в цикле, а малая часть будет хранить путь поиска информации о целом.
В принципе в любом случае у тебя есть выбор - тратить память(на указатели нарастив скорость) или тратить процессорное время(циклы уменьшающие объём хранимых данных за счёт количества вычислений), а что тратить решать тебе.
do not use your brain
Кащей вне форума Ответить с цитированием
Старый 16.09.2013, 22:41   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

массив под каждую группу
_Bers вне форума Ответить с цитированием
Старый 16.09.2013, 23:42   #7
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Код:
data dat[1000];

data *p1 = dat[0];
data *p2 = dat[250];
data *p3 = dat[500];
data *p4 = dat[750];

или

data dat1[250];
data dat2[250];
data dat3[250];
data dat4[250];
В первом варианте вы создадите массив, затем еще и указатели для каждой подгруппы массивов. Т.е затраты на память.
Во втором просто массивы, т.е затрат меньше.
Igor95 вне форума Ответить с цитированием
Старый 16.09.2013, 23:59   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Igor95 Посмотреть сообщение
В первом варианте вы создадите массив, затем еще и указатели для каждой подгруппы массивов. Т.е затраты на память.
Во втором просто массивы, т.е затрат меньше.
Я думаю, что дело не в расходе памяти. А в том, что если предполагается работать с группами - можно просто работать с группами.

Первый вариант для этого становится избыточным.
_Bers вне форума Ответить с цитированием
Старый 17.09.2013, 10:11   #9
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Про какие затраты памяти тут идет речь, даже если взять 1 случай:
Код:
data dat[1000];

data *p1 = dat[0];
data *p2 = dat[250];
data *p3 = dat[500];
data *p4 = dat[750];
Я думаю так это выглядит более естественно и не будет практически отличаться от второго случая:
Код:
data *p1= new data [1000];
data *p2 = p1 + 250*sizeof(data);
data *p3 = p1 + 500*sizeof(data);
data *p4 = p1 + 750*sizeof(data);
Все тоже самое, только разница в том что выделяться память будет в куче а не в стеке, что более целесообразно.
Может это и чушь, но это моя чушь и я ее никому не отдам.

Последний раз редактировалось Shad0wF1rst; 17.09.2013 в 10:32.
Shad0wF1rst вне форума Ответить с цитированием
Старый 17.09.2013, 10:42   #10
Артэс
Форумчанин
 
Регистрация: 05.06.2007
Сообщений: 529
По умолчанию

Благодарю всех, кто подключился к обсуждению Вообще можно сказать, при современных вычислительных скоростях, рассуждение что будет проще, может показаться пустяком, но тут дело интереса и принципа.

На самом деле, интересует вопрос процессорного времени, то, как компьютеру будет проще. Я смотрю предложили вариант "иерархической базы", интересно, первый раз такое вижу. Т.е. предлагается вместо обращения к структурам массива в цикле, по очереди (1 2 3 4 5), будет браться прямой адрес следующей структуры, из текущей? Это интересно, ибо обращение к элементам массива будет проводиться в цикле десятки раз в секунду (проверка объектов, их координат, столкновений, проверка флагов, эвентов и т.п.).

Таким образом, если думать о таком варианте, здесь логичнее цельный массив (1000), с указателями.

Целесообразно ли использовать иерархическую структуру? Намного ли разница в производительности? Если десятки раз в секунду, в цикле, будут прокручиваться 500-1000 элементов?
Артэс вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Гауссово распределение, С# alik98 Помощь студентам 0 24.02.2013 17:37
распределение по матрице mazak Общие вопросы C/C++ 0 19.08.2012 11:49
Распределение в памяти в СИ marsh123 Общие вопросы C/C++ 1 17.11.2011 16:35
Экспоненциальное распределение на C++ RayGGG Фриланс 1 28.02.2011 14:39
Экспоненциальное распределение на C++ RayGGG Помощь студентам 0 25.02.2011 18:13