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...
}

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

куда бросить? [никогда этим не занимался]
+ нужно будет выпилить это в отдельный cpp и напихать норм коменты.
я сброшу вечерком (не сейчас).
это будет 1.txt и 1.cpp.

//так для каждой из 100500 «пар» abc?

да

Это маленькая часть...

там задержки уже немного в другом переборе (while).

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

соответствие самой логике ооп наконец - если последнее тебе не важно зачем тогда выбрал с++?

соответствие самой логике ооп

с++

с++

с++

у меня истерика

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

Опять же юлёж.

У тебя явные проблемы с восприятием текста.
Reallocation invalidates all the references, pointers, and iterators referring to the elements in the sequence.

Куллстори.

Вот-вот.

Молодец, про пушбек уже забыл. Эти юлильщики.

Вместо этого стандарт определяет, *когда* реаллокация происходит: «Causes reallocation if the new size is greater than the old capacity».

Что из этого следует? Реалокация перестала быть причиной инвалидации?

Как ты отсюда высосал свюю бредятину про свойства аллокатора — остаётся загадкой.

Судя по тому, что опровергнуть мои выкладки нечем - я прав. Опять же, я не буду тебя спрашивать и требовать пояснить за «бредятину», ибо ты инстантно обделаешься.

Всё это объяснял там, на что ты отвечаешь.

Моя бредятина основывается а) на учёте дыр в стандарте. б) на основании возможных по стандарту и реальному миру имплементаций. А именно операторы делит и нью.

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

Так же, стандарт не гарантирует ничего исходя из своих требований к имплементации allocate/deallocate.

Так же стандарт позволяет использовать левые имплементации и определяет для них только api, но не поведение.

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

Я гарантирую абсолютную валидность при аллокации тем же уникальным инстансом аллокатора для каждого вектора. Эта гарантия имеет высший приоритет и никак никакая имплементация вектора соответствующая стандарту не может нарушить мою гарантию.

А т.к. структура вектора определена(массив с началом в адресе, вернувшем allocate()), то при реаллокации, если allocate() верзвращает всегда одно и то же значение - структура после перемещение будет одна и так же и все ссылки будут валидны.

Перемещать в то же место стандарт не запрещает.

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

Я гарантирую

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

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

неа. добавлением double, vector<double>.
скоро выброшу. поймете всю плачевности ситуацию.

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

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

Я знаю что конпелятор может, а что не может. Зачем ты мне это рассказываешь?

применяет достаточно агрессивные оптимизации.

А зачем это?

Вот тебе живой пример: https://lwn.net/Articles/342330/

Убогая примитивщина.

Из dereference указателя компилятор делает вывод что указатель валиден, и опускает провернку на null.

Молодец.

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

Не может. Конепелятор не может оптимизировать ошибки выпиливая их, ну никак - это аллогично.

Т.е. выпливать какие-то действия с невалидными объектами. Даже даблфри существуют - самый примитивный случай такой оптимизации, да и иди сделай *NULL - оптимизация во все поля. Этого никто и никогда делать не будет.

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

В целом оправдания конечно «сильные», но за пределами соседей за партой не работают. Доступ к невалидным объектам валидная операция.

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

Твой же случай оптимизируется не потому, что там проверки на нулл и прочее, а потом, что «ветка» где указатель равен NULL не может исполнится ну никак.

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

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

В OpenGL «колоссальные усилия», дадад. Эдик ниасиливает до сих пор.

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

По идее - наоборот

Идея улучшения локальности (и производительности) через structure of arrays контринтуитивная только до тех пор, пока не посмотришь на знаменитый график разницы скоростей чтения-записи кэша и основной памяти http://www.extremetech.com/wp-content/uploads/2014/08/CPU-DRAM.png

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

Кстати, хорошие труды по устройству современных процессоров и как для них грамотно писать сишный код есть порекомендовать? Ато я только на уровне первых пней / армов вкурсе.

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

1.txt
1.cpp

g++ 1.cpp -O3 -o 1 && ./1
...
Found   50      of      50
time: 7.8263
3.76989e-19
3.76999e-19
3.77024e-19
3.78465e-19
3.78502e-19
rgB
()
Ответ на: комментарий от unt1tled

Кстати, хорошие труды по устройству современных процессоров

Метод тыка + схемка и описание микроархитектур тут intel 64 and ia-32 architectures optimization reference manual.

и как для них грамотно писать сишный код есть порекомендовать?

Не видел ни разу такого.

Ато я только на уровне первых пней / армов вкурсе.

Ещё какая-то статейка полупротухшая про память есть. http://lwn.net/Articles/250967.

Больше даже ничего не вспомню такого фундаментального. В основном метод тыка и гуглёж по ключевым словм.

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

Да, я неправильно указал ООП. Здесь отсутствие знания структур данных и особенно знания где их не нужно применять.

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

У тебя уже первое поле структуры есть ключ. Поиск по какому мэпу? У тебя может сам мэп быть n^2, а может быть nlogn. А брутфорс кажется всегда будет n^2.

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

у меня истерика

Да мы видим уже, мог бы и не говорить. ))

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

реаллокация должна вернуть память в аллокатор и запросить заново

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

anonymous
()

конечно же 2-й вариант.

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

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

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

статейка норм.

Статейка слишком скучная и полупротухшая.

Первая часть: Структура блиджей - бесполезность(не имеющая практического смысла информация) + протухла. Типы рам - бесполезность(не имеющая практического смысла информация). Драм - бесполезность(не имеющая практического смысла информация)

Часть два: 3.2 - бесполезность(не имеющая практического смысла информация) + враньё + убого. 3.3 - имплементация(вернее эта убогая брехня) не имеет никакого отношения к реальной жизни - бесполезность(не имеющая практического смысла информация) 3.3.2 - эффекты кеша - брехня + убожество - бесполезность(не имеющая практического смысла информация). Все рассуждения о кешхитах не имеют смысла.

Почему нули так любят о них рассуждать мне не ясно.

3.12 - тлб. Абсолютно бесполезная инфа. Тлб есть - ахринеть. Там 80записей и типа, если мы будем дёргать больше 80 - будет медленнее. Ахринеть. Про 400тактов - брехня. бесполезность(не имеющая практического смысла информация)

3.3.2 - случайный доступ медленнее - ахринеть. Нуль кукарекает про какой-то там л2 и ещё какую-то неведомую брехню. Опять какой-то убогий кешмисрейт. бесполезность(не имеющая практического смысла информация)

Как всегда меня радуют эти аутисты, которые измеряют доступ к памяти в тактах.

3.3.3-4 бесполезность(не имеющая практического смысла информация).

Multi Threaded Measurements - какая-то вообще неведомая брехня. Чё он там мерил, зачем - мне не ведомо. Опять же в тактах. Аутист.

3.4 - ничего конкретного - бесполезность(не имеющая практического смысла информация)

3.5 - опять мисрейт. Любой обезьяне, которая что-то кукарекает про мисрейт надо плювать в рожу - это единственное, чего она достойна.

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

Каким образом бабуин рассуждает об миссрейте, зачем?

fsb - протухло.

Memory part 3: Virtual Memory - неводомое убожество. Ничего конкретного. Терминально бесполезное чтиво.

Memory part 4: NUMA support - тотальная бехня + специфично.

Memory part 5: What programmers can do

6.1 nt - полезно.

6.2 днище абсолютно не понимает в том, о чём кукарекает.

6.2.2 - днище так же не понимает о чём кукарекает. Целой портянкой днище пыталось сказать - «длинна горячего кода больше l1i плохо» - ахринеть. Но так и не сказал - сказал одну херню.

6.2.3-4 - ничего конкретного.

6.3.* - с натяжкой можно назвать полезной. На самом деле пользы нет, если адепт уже знает эти ключевые слова. Ничего конкретного нет.

Memory part 6: More things programmers can do - можно назвать полезным, как экскурс в атомики и ключевые слова. В целомт ак же ничего конкретного.

Остальные части чисто чтоб почитать. В целом можно найти что-то интересное.

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

есть ещё популярное среди гиков: http://www.agner.org/optimize/

Ничего внятного в его бложике я так и не нашёл. Известен табличкой.

intel manuals explained, так сказать

«Я прочитал мануал по счётчикам и написал тулзу» - explained во все поля.

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

Конкретней. Или обделаешься как стак бабуинов до тебя?

Обделался под регистрантом - решил зайти под аноном и спровоцировать меня на удаление твоего обсёра?

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

Чего ещё от нуля можно ожидать. Ну давай, кукарекни мне что-то конкретное, чтоб я тебя с дерьмецом по быстрому смешал и ты отсюда свалил.

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

Мб, шизофрения + рекурсия :)

Ждем переполнения стека. :)

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

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

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

Ты обоссался по всем пунктам, как и твои собрехатели. Твой жалкий слив на школозадачки меня не интересует.

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

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

Ламерок обделался, когда попытался жалким скулежом кукарекать мне, что я «этого не говорил» - был обоссан, после чего совсем сломался и начал нести херню, как и сейчас.

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

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

Царь говорил, что Дейкстра — говно и обещал выкатить свое решение, но не выкатил. А теперь вот бесится. :D

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

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

Типичное поведение мрази.

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

Над тобой все смеялись тогда.

Впрочем, это далеко не первый случай, когда ты сливаешься от решения конкретной задачи.

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