// virtual_test.cpp #include #include #include #include class Material { public: virtual ~Material() = default; virtual void render() const = 0; }; struct Metal : public Material { float data[4]; void render() const override { asm volatile("" ::: "memory"); } }; struct Lambertian : public Material { float data[4]; void render() const override { asm volatile("" ::: "memory"); } }; struct Plastic : public Material { float data[4]; void render() const override { asm volatile("" ::: "memory"); } }; struct Glass : public Material { float data[4]; void render() const override { asm volatile("" ::: "memory"); } }; int main() { const size_t count = 400000; std::vector> materials(count); for (size_t i = 0; i < count; ++i) { switch(i % 4) { case 0: materials[i] = std::make_unique(); break; case 1: materials[i] = std::make_unique(); break; case 2: materials[i] = std::make_unique(); break; case 3: materials[i] = std::make_unique(); break; } } auto start_time = std::chrono::high_resolution_clock::now(); for (const auto& mat : materials) { mat->render(); } auto end_time = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(end_time - start_time); std::cout << "Virtual Function Execution Time: " << duration.count() << " µs\n"; return 0; }