Используя массивы или std :: vectors в C ++, какова разница в производительности? - PullRequest
187 голосов
/ 19 декабря 2008

В нашем курсе C ++ они предлагают больше не использовать массивы C ++ в новых проектах. Насколько я знаю, сам Stroustroup предлагает не использовать массивы. Но есть ли существенные различия в производительности?

Ответы [ 19 ]

2 голосов
/ 19 декабря 2008

Разница в производительности между ними очень сильно зависит от реализации - если вы сравните плохо реализованный std :: vector с оптимальной реализацией массива, массив выиграет, но перевернет его, и вектор победит ...

Пока вы сравниваете яблоки с яблоками (либо массив, и вектор имеют фиксированное число элементов, либо оба динамически изменяются в размерах), я думаю, что разница в производительности незначительна, если вы следуете практике кодирования STL , Не забывайте, что использование стандартных контейнеров C ++ также позволяет вам использовать предварительно свернутые алгоритмы, которые являются частью стандартной библиотеки C ++, и большинство из них, вероятно, будут более эффективными, чем обычная реализация того же алгоритма, который вы создали сами .

Тем не менее, ИМХО, вектор выигрывает в сценарии отладки с отладочным STL, поскольку большинство реализаций STL с надлежащим режимом отладки могут по крайней мере выделить / скрыть типичные ошибки, допущенные людьми при работе со стандартными контейнерами.

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

1 голос
/ 04 марта 2019

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

Вызывают ли векторы 2d + производительность?

Суть в том, что есть небольшой объем служебной информации, когда каждый субвектор имеет информацию о размере, и не обязательно будет сериализация данных (как это происходит с многомерными массивами c). Это отсутствие сериализации может предложить больше возможностей, чем микрооптимизация. Если вы работаете с многомерными массивами, может быть лучше просто расширить std :: vector и запустить собственную функцию get / set / resize bits.

1 голос
/ 19 декабря 2008

Если вам не нужно динамически регулировать размер, у вас есть накладные расходы памяти на сохранение емкости (один указатель / size_t). Вот и все.

1 голос
/ 14 апреля 2013

Следующий простой тест:

C ++ Array vs Vector Объяснение теста производительности

противоречит выводам из «Сравнения кода ассемблера, сгенерированного для базовых операций индексации, разыменования и приращения векторов и массивов / указателей»

Должна быть разница между массивами и векторами. Тест говорит так ... просто попробуйте, код есть ...

1 голос
/ 12 мая 2009

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

1 голос
/ 19 декабря 2008

Может быть некоторый крайний случай, когда у вас есть векторный доступ внутри встроенной функции внутри встроенной функции, когда вы вышли за пределы того, что компилятор встроит, и это вызовет вызов функции. Это было бы настолько редко, что о нём не стоит беспокоиться - в общем, я бы согласился с litb .

Я удивлен, что никто еще не упомянул об этом - не беспокойтесь о производительности, пока не будет доказано, что она является проблемой, а затем оцените ее.

1 голос
/ 19 декабря 2008

Я бы сказал, что главная проблема не в производительности, а в безопасности. Вы можете сделать много ошибок с массивами (например, рассмотрите возможность изменения размера), когда вектор избавит вас от большой боли.

1 голос
/ 19 декабря 2008

Иногда массивы действительно лучше, чем векторы. Если вы всегда манипулируете набор объектов фиксированной длины, массивы лучше. Рассмотрим следующие фрагменты кода:

int main() {
int v[3];
v[0]=1; v[1]=2;v[2]=3;
int sum;
int starttime=time(NULL);
cout << starttime << endl;
for (int i=0;i<50000;i++)
for (int j=0;j<10000;j++) {
X x(v);
sum+=x.first();
}
int endtime=time(NULL);
cout << endtime << endl;
cout << endtime - starttime << endl;

}

где векторная версия X равна

class X {
vector<int> vec;
public:
X(const vector<int>& v) {vec = v;}
int first() { return vec[0];}
};

и версия массива X:

class X {
int f[3];

public:
X(int a[]) {f[0]=a[0]; f[1]=a[1];f[2]=a[2];}
int first() { return f[0];}
};

Версия массива main () будет быстрее, потому что мы избегаем издержки «нового» каждый раз во внутреннем цикле.

(Этот код был размещен мной на comp.lang.c ++).

0 голосов
/ 07 декабря 2018

Предполагая массив фиксированной длины (например, int* v = new int[1000]; против std::vector<int> v(1000);, с размером v, сохраняющим фиксированным значение 1000), единственный фактор производительности, который действительно имеет значение (или, по крайней мере, имел значение для меня, когда я был в подобной дилемме) скорость доступа к элементу. Я посмотрел векторный код STL, и вот что я нашел:

const_reference
operator[](size_type __n) const
{ return *(this->_M_impl._M_start + __n); }

Эта функция наверняка будет встроена компилятором. Таким образом, пока единственное, что вы планируете делать с v, - это обращаться к его элементам с помощью operator[], похоже, что на самом деле не должно быть никакой разницы в производительности.

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