Что быстрее в C: структуры или массивы? - PullRequest
4 голосов
/ 30 декабря 2010

Я хочу реализовать (что представляет собой абстрактно) двумерную матрицу 4x4.Весь код, который я пишу для умножения матриц и так далее, будет полностью «развернут», то есть я не буду использовать циклы для доступа и записи записей данных в матрице.

Мой вопросв C: было бы быстрее использовать структуру как таковую:

typedef struct {
    double e0, e1, e2, e3, e4, ..., e15
} My4x4Matrix;

Или это было бы быстрее:

typedef double My4x4Matrix[16];

Учитывая, что я буду обращаться к каждому элементу матрицы индивидуальнокак таковой:

My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c.e0=a.e0+b.e0;
c.e1=a.e1+b.e1;
...

Или

My4x4Matrix a,b,c;
// (Some initialization of a and b.)
...
c[0]=a[0]+b[0];
c[1]=a[1]+b[1];
...

Или они точно такой же скорости?

Ответы [ 4 ]

15 голосов
/ 30 декабря 2010

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

Я также очень сомневаюсь в вашем выборе «раскрутить» (развернуть?) Все операции вручную. Любой хороший компилятор может полностью развернуть циклы с постоянным количеством итераций для вас, и, возможно, даже может генерировать SIMD-код и / или оптимально планировать порядок инструкций. Вам будет нелегко делать лучше вручную, и в итоге вы получите код, который ужасно читать. Тот факт, что вы задали этот вопрос, подсказывает мне, что вы, вероятно, недостаточно опытны, чтобы работать лучше, чем даже наивный оптимизирующий компилятор.

9 голосов
/ 30 декабря 2010

Элементы (поля) структуры могут быть доступны только по их именам, явно указанным в источнике программы, что означает, что каждый раз, когда вы обращаетесь к полю, фактическое поле должно быть выбрано и жестко закодировано во время компиляции.Если вы хотите реализовать то же самое с массивами, это будет означать, что вы будете использовать явные постоянные индексы массива во время компиляции (как в вашем примере).В этом случае производительность обоих будет одинаковой, а сгенерированный код будет абсолютно одинаковым (исключая из рассмотрения «злонамеренные» компиляторы).

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

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

1 голос
/ 30 декабря 2010

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

1 голос
/ 30 декабря 2010

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

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