2010-07-11 6 views
3

мне было интересно, если это было быстрее, чтобы иметь std::vector<std::vector<double>> где вложенная вектор всегда имеет 2 элемента, или это быстрее, чтобы иметь std::vector<MyPoint> где MyPoint определяется как:Какая из них быстрее?

struct MyPoint { 
    double Point[2]; 
}; 

Благодарности

+0

До тех пор, пока вы не измерили, напишите код, который легче читать (и ИМО - это тот, который использует 'struct'). Только жертву читабельности, когда вы измерили, и «вектор» «векторных» оказывается значительно быстрее. – sbi

ответ

11

vector<MyPoint> является предпочтительным, поскольку MyPoint вероятно:

  1. быть меньше, чем vector<double> (вы можете проверить это с sizeof), и/или
  2. сделать меньше ассигнований. Сам векторный объект является небольшим, но обычно указывает на данные о куче. Возможно, чтобы небольшие векторы были оптимизированы, чтобы избежать дополнительного распределения путем вложения данных в векторный объект, но не рассчитывайте на это, поэтому
  3. имеет меньшие накладные расходы при инициализации, уничтожении и копировании.

Например, на моем 32-битном НКУ, std::vector<double> имеет размер 12, в то время как MyPoint имеет размер 16, но вектор делает дополнительное выделение. В 64-битной реализации MyPoint почти наверняка будет того же размера, но std::vector, вероятно, будет больше.

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

5

Я полагаю, во втором примере вы имели в виду: std::vector<MyPoint>? Да, этот вариант был бы более эффективным. Например, вы можете зарезервировать большой объем памяти проще, и вам придется делать меньше распределений в целом.

Вместо MyPoint вы также можете использовать std::pair<double, double>.

+0

+1 для упоминания 'std :: pair '. – rubenvb

0

Вы имеете в виду std::vector<MyPoint> во втором примере? Это было бы значительно лучше, чем наличие вектора внутри вектора.

1

Не только вектор двух элементов медленнее, но и странно иметь динамическую структуру, чтобы сохранить всегда два элемента (при условии, что он не изменится). Я бы использовал struct MyPoint { double x, y; }; для удобства.

Смежные вопросы