влияет ли порядок членов объектов класса на производительность? - PullRequest
14 голосов
/ 29 сентября 2010

Может ли порядок членов в бинарной архитектуре объектов класса как-то повлиять на производительность приложений, использующих этот класс? и мне интересно, как определить порядок членов POD, если ответ положительный, так как программист определяет порядок членов по порядку их объявлений

Ответы [ 3 ]

28 голосов
/ 29 сентября 2010

Абсолютно.C ++ гарантирует, что порядок объектов в памяти совпадает с порядком объявления, если только не вмешивается квалификатор доступа.

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

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

C ++ 03 §9 / 12:

Нестатические элементы данных (без объединения)) класс, объявленный без промежуточного спецификатора доступа, распределяется таким образом, чтобы более поздние члены имели более высокие адреса в объекте класса.Порядок распределения нестатических элементов данных, разделенных спецификатором доступа, не определен (11.1).Требования выравнивания реализации могут привести к тому, что два смежных элемента не будут выделяться сразу после друг друга;То же самое касается требований к пространству для управления виртуальными функциями (10.3) и виртуальными базовыми классами (10.1).

7 голосов
/ 29 сентября 2010

Абсолютно согласен с Potatoswatter. Однако следует добавить еще один момент о строках кэша ЦП.

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

Дело в том, что всякий раз, когда поток изменяет адрес памяти, который кешируется в другом ЦП, этот ЦПУ немедленно аннулирует строку кэша, содержащую этот адрес. Так что неправильный порядок членов может привести к неоправданному аннулированию кэша и снижению производительности.

4 голосов
/ 30 сентября 2010

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

Из-за заполнения размер объекта класса зависит от порядка объявления переменных-членов.

Следующее объявление, вероятно, займет 12 байтов

class foo {
    char c1;
    int  i;
    char c2;
}

Однако при простом переупорядочении порядка объявления членов следующее, вероятно, займет 8 байтов

class bar {
    int  i;
    char c1;
    char c2;
}

В машинах, выровненных по 4-байтовым словам:

sizeof( foo ) = 12

но

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