LINUX.ORG.RU

Array of structures vs Structure of arrays

 


0

6

Array of structures vs Structure of arrays

Какиe будут ваши за и против?

struct User
{
  int id;
  int money;
  int something;
  char something_else;
  bool active;
  ...
  ...
  float more_data;
}

std::vector<User*> users;

или

struct UserManager
{
  size_t amount;

  int * ids;
  int * money;
  int * something;
  char * something_else;
  bool * active;
  ...
  ...
  float * more_data;

  void setUserMoney(int uid, int money);
  //etc...
}

Ответ на: комментарий от xpahos

А какой ключ использовать в МАП? А так же, со скольки элементов поиск в мапе станет быстрее чем брут форс перебор вектора?

CyberK
() автор топика
Ответ на: комментарий от hlebushek

А где здесь можно добавить наследование и полиморфизм?

CyberK
() автор топика
Ответ на: комментарий от hlebushek

Как часто требуется вся инфа одного пользователя в реальных программах и как часто нужно обработать несколько полей многих юзеров?

CyberK
() автор топика

IMHO имеют право на существование оба варианта, тут всё зависит от конкретной задачи, но в 99,99% случаев массив структур предпочтительней. И кстати, под array многие понимают не совсем vector.

mbivanyuk ★★★★★
()
Ответ на: комментарий от CyberK

Как часто требуется вся инфа одного пользователя в реальных программах

Не обязательно вся, может несколько полей требуется. Часто. Если провести аналогию с SQL, то в любом запросе с WHERE или JOIN

SELECT User.FirstName, User.LastName FROM User WHERE User.RegistrationDate > 2014-02-26
hlebushek ★★
()
Ответ на: комментарий от CyberK

Потому что красивее с точки зрения программистских абстракций и проще реализовать.

hlebushek ★★
()
Ответ на: комментарий от CyberK

Я не говорил что массив структур всегда предпочтительней, но в большинстве случаев наверное. Причин много - читаемость кода, возможность удалять или добавлять пользователей, легкость передачи пользователя функции, соответствие самой логике ооп наконец - если последнее тебе не важно зачем тогда выбрал с++?

mbivanyuk ★★★★★
()
Последнее исправление: mbivanyuk (всего исправлений: 1)
Ответ на: комментарий от Tanger

Что более коммон кейс : распечатать все поля одного юзера или обработка нескольких полей многих юзеров?

CyberK
() автор топика
Ответ на: комментарий от hlebushek

Так какой пример больше подходит для такой работы? Только без SQL синтаксиса оф коурс.

CyberK
() автор топика
Ответ на: комментарий от mbivanyuk

Где здесь логика ООП? Я здесь не вижу не одного из принципов ООП. Не в первом и не во втором примере. Покажите пожалуйста как это сделать ООП. Спасибо заранее.

CyberK
() автор топика
Ответ на: комментарий от CyberK

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

mbivanyuk ★★★★★
()
Ответ на: комментарий от mbivanyuk

Извините за передергивание, я просто совсем запутался в ваших ответах. Что такое логика ООП? Хранение в одном месте? Они так и хранятся - в одном юзерменаджере.

Еще раз дико извиняюсь за передергивание, я просто совсем не знаком с логикой ООП, я слышал только про 3 принципа ООП - наследывание, енкапсуляциыя и полиморфизм

CyberK
() автор топика
Последнее исправление: CyberK (всего исправлений: 2)
Ответ на: комментарий от anonymous

How can we contact in private? (i don't want to share my real info on Linux.org.ru)

CyberK
() автор топика

Допустим у вас есть некий набор объектов для обработки. Часть объектов при расчетах используют ids, money, active, а часть ids, money, something, something_else, active.
Тогда второй вариант будет более cache-friendly, нежели первый.

andreyu ★★★★★
()
Ответ на: комментарий от anonymous

А то, что у меня нет учётки - скажи спасибо модераторам.

Удаление аккаунта - это следствие. А причиной является несколько эмоциональная манера общения, пропитанная безудержной «илитарностью».

andreyu ★★★★★
()
Ответ на: комментарий от Chaser_Andrey

Ну чтож ты так быстро обделался-то. Давай ещё раз.

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

А если и есть, то «ко-ко-ко - слово пропустил, ко-ко-ко», но с такими куллстори ты далеко не уедешь.

Если я написал, что кто-то во что-то не может - я конкретно пояснил почему. Почему этого не можешь сделать ты?

anonymous
()
Ответ на: комментарий от BruteForce

Это что вообще?

Не надоело как попугаю повторять «это не с++»? Если код собирается компилятором с++, то это и есть с++.

andreyu ★★★★★
()
Ответ на: комментарий от CyberK

а как с царём связатся?

Из-за манеры вести беседу, его аккаунты банят с завидным постоянством. Но попробуйте прямо тут задать ему вопрос. На самом деле, если отбросить кучу мусора в его постах, то там можно найти весьма полезные и правильные мысли.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Удаление аккаунта - это следствие.

Да, следствие того, что царь слишком иллитен.

А причиной является несколько эмоциональная манера общения, пропитанная безудержной «илитарностью».

Чистейшей воды брехня.

Выпил царя происходит по одно простой причине, а именно коррупция. Я уже это 2дня назад писал и выпил меня - тому доказательство. Объективно царя не за что выпиливать.

Всё просто - имеем набор 5-тизвёздочных адептов, которых я уже давно смешал с дерьмом и не по одному разу. Имеет обиду и пробитую жопу. А раз адепт ничего не может мне ответить? То что надо сделать? Правильно - врать, дискредитировать и выпиливать.

Одни стучат, другие выпиливают, третьи провоцируют и срут.

Я всегда не мог понять одну вещь. Ну царь же балабол псевдоилитный ничегонемогущий. Казалось бы - вся «настоящаяилита» должна была давно поставить его на место. Я жажду разоблачений - я жажду срывания покровов. Где всё это?

А в место этого я что получаю? Скулёж, обсёр, жалкое клянченье «Забанте царя» и крысятничество.

А причиной является несколько эмоциональная манера общения, пропитанная безудержной «илитарностью».

Я не вижу в правилах пунктов, которые это запрещают.

anonymous
()
Ответ на: комментарий от anonymous

Так вы да царь? А есть ли в интернете где-нибудь примеры вашего кода/проектов чтоб можно было почитать?

CyberK
() автор топика
Ответ на: комментарий от anonymous

При этом заметим - это не я такой великий «смешиватель с дерьмом» и не я это начинал.

Пацаны привыкли кичится своей иллитарностью. Про это я так же рассказывал. В основном - основная такая жила ненависти - это сишка. Т.е. ненависить у модераторов я заработал именно в срачах про сишку и прочее.

При этом пацаны привыкли, что все они - выходцы из одной парты. Т.е. они конечно могут о чём-то спорить, но всех их знание и восприятия мира в целом одинаковые и из одного источника.

Именно на это почве и возникает конфликт. У пацана разрыв шаблона - как это его доводы и агрументы, которые работали в среде таких же адептов - не работают. При этом ладно бы царь был аутист, но ведь реально.

Мне вбили в бошку каких-то авторитетов. Почему я их почитаю? Не знаю - так модно. Царь говорит, что они нули и ничего не сделали? Ну да - ответить нечего, ибо реально ничего не сделали.

Царь гонит на ритчи, который не умел в код? Как он мог. Но у царя есть пруфцы, а у адепта слепая вера.

И так со всем. Аргументы вида «мне так проще» не работают. Хотя вроде как все договорились, что оправдывать дерьмо надо всегда. А тут не прокатывает, а ведь ответить-то нечего. Реально ведь дерьмище?

А уж если брать код, то если раньше ваять убогую лапшу на сишке можно было безнаказанно и постить её то же. Оправдываясь перед всеми, что только так можно. Теперь же это не канает, а ответить так же нечего.

Раньше можно было кукареть ничего не зная о матчасти - правильно, можно, ибо никто о ней ничего не знает. А мифология в башке одна и та же. Поэтому толкать можно было любую херню, а теперь нет.

anonymous
()
Ответ на: комментарий от anonymous

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

CyberK
() автор топика
Ответ на: комментарий от Waterlaz

Теперь я точно уверен, что ты ничего никогда не писал. Вообще ничего.

Меня не интересует мнение нонейма, который писал от силы лабу и единственное, что может - это обделаться.

Ты же сам писал, что

Что? Не смог даже в это.

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

Так какой, черт побери, пример реального применения ты тут хочешь?

Чего? Опять балаболка пытается делать выводы и кого-то ловить. Что тебе не ясно?

Почему я привёл эти реальные примеры, а балаболка не может? Зачем ты мне что-то пытаешься писать?

Есть что ответить по существу - вперёд, помоги предыдущему - выкати то, что я прошу. Не можешь? Ну дак иди за парту там и спорь с соседями.

В чём твоя проблема?

anonymous
()
Ответ на: комментарий от CyberK

А где можно пожалуйста почитать примеры вашего кода?

Не пишу код - я «работаю» в другой сфере. С этим миром меня связывает только то, что я когда-то «работал» в embedded.

Я обыкновенный птушник с завода.

Со всем этим не ко мне - я могу только отвечать на конкретные вопросы - всё остальное меня не интересует.

anonymous
()
Ответ на: комментарий от hlebushek

В ООП по-моему все же главная вещь это наследование

Хороший вброс )

Joe_Bishop
()

а чем вот так плохо?

struct( or class) Users_for_smth
{
  vector<int> id;
  vector<int> money;
  vector<int> something;
  vector<char> something_else;
  vector<bool> active;
  ...
  vector<float> more_data;
  void addUser(...);
  void removeUser(...);
  // etc ...
}

rgB
()

Только первый вариант - массив объектов. Или, если сильно надо, массив указателей на объекты.

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

invy ★★★★★
()
Ответ на: комментарий от CyberK

А так же, со скольки элементов поиск в мапе станет быстрее чем брут форс перебор вектора?

С трёх.

invy ★★★★★
()
struct User
{
  int id;
  int money;
  int something;
  char something_else;
  bool active;
  ...
  ...
  float more_data;
}

std::vector<User> users;
anonymous
()

не идеал сферического в вакууме.


struct Users{
   private:
   size_t amount;
   std::vector<int>ids;
   std::vector<int>money;
   std::vector<int>something;
   std::vector<char>something_else;
   ...
   ...
   public:
   Users(){...
   }
//etc
}
qulinxao ★★☆
()
Ответ на: комментарий от anonymous

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

Chaser_Andrey ★★★★★
()
Ответ на: комментарий от rgB

Тем, что локальность данных меньше, а это означает лишние кэш-промахи. Если действительно хочешь разобраться в этом, вот есть хорошая статья: https://people.freebsd.org/~lstewart/articles/cpumemory.pdf

Manhunt ★★★★★
()
Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от anonymous

Выпил царя происходит по одно простой причине, а именно коррупция.

Да-да, заговор против царя. Жидомассоны лор-а под тайным покровительством макскома :D

Manhunt ★★★★★
()
Ответ на: комментарий от CyberK

2. Есть функция устанавливающая active в зависимости от баланса, в одном потоке баланс уменьшили, в другом пополнили, второй почему-то отработал медленнее, поэтому тот в котором уменьшали завершился последним и установилось active = false, хотя баланс уже больше нуля. Чтобы избежать потребуются блокировки, а блокировать тут только весь массив значений целиком выйдет.
3. Как ты представляешь добавление нескольких записей в несколько массивов многопоточно без блокирования всех массивов?

Tark ★★
()
Ответ на: Это эталонного тупняка тред? от SystemD-hater

Потом ещё раз смотришь и думаешь: да нет, хрень какая-то.

Второй вариант часто в геймдеве используется, например. Это называется «data driven» и вполне себе имеет применение.

DarkEld3r ★★★★★
()

Лично мне первый вариант ближе. И да, тут плюсы особо ни при чём, как выше сказали.

al_exquemelin ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.