Лучший способ получить доступ к вложенным структурам данных? - PullRequest
0 голосов
/ 03 июня 2010

Я хотел бы знать, каков наилучший (с точки зрения производительности) доступ к большой структуре данных. Существует около ста способов сделать это, но какой компилятор наиболее доступен для оптимизации?

Можно получить доступ к значению с помощью

foo[someindex].bar[indexlist[i].subelement[j]].baz[0]

или создайте псевдонимы указателей, такие как

sometype_t* tmpfoo = &foo[someindex];
tmpfoo->bar[indexlist[i].subelement[j]].baz[0]

или создайте ссылочные псевдонимы, такие как

sometype_t &tmpfoo = foo[someindex];
tmpfoo.bar[indexlist[i].subelement[j]].baz[0]

и так далее ...

Ответы [ 3 ]

5 голосов
/ 03 июня 2010

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

При этом 99% вероятности того, что компилятор сгенерирует одинаковый код для всех трех примеров.

1 голос
/ 03 июня 2010

Все три из описанных здесь будут скомпилированы (с приличным компилятором) в одно и то же.

0 голосов
/ 08 июня 2010

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

SomeType  *pSomeType = &asManyLevelsAsItMakesSense[someIndex];
pSomeType->subSomeNestedLevels = ...;

Я нахожу это особенно полезным при работе с глубокими вложенными структурами в циклах. Определите инвариантные вложенные части и извлеките их из цикла.

SomeType  *pSomeType = &...;
for (i = 0; i < N; i++)
    pSomeType->field[i] = ...;

Как всегда, стоит узнать ваш компилятор и что он на самом деле генерирует. Иногда вы можете зависнуть от компилятора для вашего проекта, который вообще не оптимизируется, и такие мелочи могут иметь значение (но не думайте, что это произойдет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...