2D массив и структура (C ++) - PullRequest
       19

2D массив и структура (C ++)

1 голос
/ 07 февраля 2012

Если важна скорость выполнения, я должен использовать это,

struct myType {

    float dim[3];
};

myType arr[size];

или использовать двумерный массив как arr[size][index]

Ответы [ 6 ]

2 голосов
/ 07 февраля 2012

Неважно.Компилятор выдаст один и тот же код независимо от почти всех случаев.Единственная разница была бы, если бы структура вызывала какое-то заполнение, но учитывая, что у вас есть плавающие числа, что кажется маловероятным.

1 голос
/ 10 февраля 2012

Еще одна вещь, о которой следует помнить, что упоминается другой автор: если dim всегда будет иметь размер 3 в структуре, но коллекция действительно представляет что-то вроде «Red, Green, Blue» или «X, Y, Z» или «Автомобиль, Грузовик, Лодка», с точки зрения технического обслуживания, вам может быть лучше их сломать. То есть используйте что-то вроде

typedef struct VEHICLES  
{  
  float fCar;  
  float fTruck;  
  float fBoat;  
} Vehicles;  

Таким образом, когда вы возвращаетесь через два года, чтобы отладить его, или кто-то еще должен посмотреть на него, им не нужно будет угадывать, на что ссылаются dim [0], dim [1] и dim [2].

1 голос
/ 07 февраля 2012

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

Структура массива также более доступна для параллельной обработки, например, с использованием операций SIMD.В некоторой степени это неудачно, поскольку компоновка объекта обычно отличается.На самом деле, используемые вами массивы, вероятно, похожи, но если вы измените вещи, чтобы они стали float array[3][size], вещи станут другими.

1 голос
/ 07 февраля 2012

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

1 голос
/ 07 февраля 2012

Нет разницы вообще. Выберите то, что более читабельно для вас.

Если вы не работаете на какой-то странной платформе, структура памяти этих двух будет одинаковой - и для компилятора это самое главное.

0 голосов
/ 07 февраля 2012

Возможно, вы захотите отобразить 2d массив на 1d.Может быть более дружественным к кешу

...