Что из этого быстрее? - PullRequest
3 голосов
/ 12 июля 2010

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

struct MyPoint {
  double Point[2];
};

Спасибо

Ответы [ 4 ]

11 голосов
/ 12 июля 2010

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

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

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

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

5 голосов
/ 12 июля 2010

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

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

1 голос
/ 12 июля 2010

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

0 голосов
/ 12 июля 2010

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

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