Мне стало любопытно по поводу заявленных наблюдений, и я смог их воспроизвести сам. Затем я поменял две альтернативные реализации, и теперь таблицы были перевернуты. Версия std::vector<int> *tab [n]
, которая теперь выполняется первой, теперь была значительно медленнее, чем другая, которая теперь выполняется второй.
Объяснение очень простое. Библиотека C ++ повторно использует выделенную память. Когда вы используете память самостоятельно, через new
или косвенно, выделяя память для значений в контейнерах, а затем освобождаете ее, библиотека C ++ не освобождает освобожденную память обратно операционной системе, а использует ее повторно. в следующий раз ему понадобится больше памяти без необходимости запрашивать у операционной системы больше. Нет закона, который говорит, что это то, что должна делать библиотека C ++, но это типичное поведение современных реализаций C ++.
Итак, что это, очень просто. Ваш первый тест включает в себя время, необходимое для выделения части памяти из операционной системы. С ++ требовалась память для этих векторов, и это заняло дополнительное время. Ваш второй раздел кода не должен был это делать, потому что эта память уже была выделена, а затем освобождена первым тестом; поэтому второй тест просто привел к тому, что ваша библиотека C ++ повторно использовала уже имеющуюся память, но не использовалась (это было видно по трассировке системного вызова).
Типичные результаты от простого повторения первого теста во второй раз:
vector resize duration == 191 ticks
vector resize duration == 48 ticks
*vector resize duration== 63 ticks