Почему код реализации вектора работает медленнее, стандартного std::vector

Подскажите пожалуйста, а почему первый код работает быстрее второго ?

30 мс против 140 мс.

Запускал в release в VS2019. и на x32 и x64.

1)То есть я просто создаю вектор int и в цикле обращаюсь к его элементам:

#include <iostream>
#include <chrono>
#include <string>
#include <vector>
 
int main()
{
std::chrono::time_point<std::chrono::steady_clock> start;
std::chrono::time_point<std::chrono::steady_clock> end;
unsigned long long result_ns;
 
 
    std::vector<int>my_vector;
 
    my_vector.resize(99999999);
 
    int my_int;
 
 
    start = std::chrono::steady_clock::now();
    //---------------------------------------
    for (int i = 0; i < 99999999;i++)
    {
        my_int = my_vector[i] + my_vector[i];
    }
    //---------------------------------------
    end = std::chrono::steady_clock::now();
 
    std::cout << my_int << std::endl;  //Для того, чтобы компилятор не с оптимизировал цикл.
 
    result_ns = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();   
    std::cout << "time1:"<<result_ns << std::endl;           //Выводим время работы цикла
}

2)То же самое, что и в п.1, но только через создание самого примитивного класса, который выделяет память под int и позволяет обращаться к его элементам:

#include <iostream>
#include <chrono>
#include <string>
#include <vector>




class my_class
{
 
public:
 
    int my_get_value(int i)
    {
        return my_char_p[i];
    }
 
 
    void my_resize(int y)
    {
        my_char_p = (int*)malloc(y*sizeof(int));
    }
 
 
private:
 
    int* my_char_p;
 
};
 
 
 
 
int main()
{
std::chrono::time_point<std::chrono::steady_clock> start;
std::chrono::time_point<std::chrono::steady_clock> end;
unsigned long long result_ns;
 
 
my_class my_class_vector;
 
my_class_vector.my_resize(99999999);
 
int my_int1;
 
start = std::chrono::steady_clock::now();
 
//---------------------------------------
    for (int i = 0; i < 99999999; i++)
    {
        my_int1 = my_class_vector.my_get_value(i) + my_class_vector.my_get_value(i);
    }
//---------------------------------------
end = std::chrono::steady_clock::now();
 
std::cout << my_int1 << std::endl;
 
result_ns = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();   //результат в нано секундах
std::cout << "time1:" << result_ns << std::endl;
}

Почему в стандартном std::vector - это происходит в разы быстрее, чем в условно реализованном буквально из пары строчек ?


Ответы (0 шт):