#include <chrono>
#include <cstdint>
#include <iostream>
#include <random>
#include <vector>

using accu_t = std::uint32_t;
using element_t = std::uint32_t;
std::size_t const num_elements = 10000000;

int main()
{
	std::vector<element_t> elements;
	elements.reserve(num_elements);
	std::uniform_int_distribution<element_t> distribution;
	std::mt19937_64 engine;
	for (std::size_t i = 0; i != num_elements; ++i)
	{
		elements.push_back(distribution(engine));
	}

#ifdef USE_PTR
	std::vector<element_t *> ptrs;
	ptrs.reserve(num_elements);
	for (auto & element : elements) ptrs.push_back(&element);
#endif

	accu_t sum = 0;
	auto start = std::chrono::steady_clock::now();

#ifdef USE_PTR
	for (auto ptr : ptrs) sum += *ptr;
#else
	for (auto element : elements) sum += element;
#endif

	auto stop = std::chrono::steady_clock::now();
	auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start);
	std::cout << "sum: " << sum << "\n";
	std::cout << ms.count() << "ms\n";
}