// crtp_test.cpp #include #include #include template struct Material { void render() const { static_cast(this)->renderImpl(); } }; void process(const auto& mat) { mat.render(); } struct Metal : Material { float data[4]; void renderImpl() const { asm volatile("" ::: "memory"); } }; struct Lambertian : Material { float data[4]; void renderImpl() const { asm volatile("" ::: "memory"); } }; struct Plastic : Material { float data[4]; void renderImpl() const { asm volatile("" ::: "memory"); } }; struct Glass : Material { float data[4]; void renderImpl() const { asm volatile("" ::: "memory"); } }; int main() { const size_t count = 400000; std::vector metals(count / 4); std::vector lambertians(count / 4); std::vector plastics(count / 4); std::vector glasses(count / 4); std::vector*> material_ptrs; auto start_time = std::chrono::high_resolution_clock::now(); for(const auto& m : metals) m.render(); for(const auto& l : lambertians) l.render(); for(const auto& p : plastics) p.render(); for(const auto& g : glasses) g.render(); // for (const auto& m : metals) process(m); // for (const auto& l : lambertians) process(l); // for (const auto& p : plastics) process(p); // for (const auto& g : glasses) process(g); auto end_time = std::chrono::high_resolution_clock::now(); auto duration = std::chrono::duration_cast(end_time - start_time); std::cout << "CRTP Static Polymorphism Execution Time: " << duration.count() << " µs\n"; return 0; }