Yes, using std::any
does have a performance cost compared to using concrete types directly.
When you use a concrete type, the compiler knows the exact size and layout of the object. This allows it to generate efficient code for creating, copying, and accessing the object.
With std::any
, the actual type is not known at compile-time. std::any
has to store the value in dynamically allocated memory and manage that memory. Accessing the value requires a runtime type check (via std::any_cast
) and a potential copy.
Here's an example:
std::any a = 42;
// Runtime type check, potential copy
int i = std::any_cast<int>(a);
Compared to:
int a = 42;
int i = a;// No runtime overhead
The performance hit of std::any
is most significant when:
std::any
is large (more data to copy)std::any
is accessed frequently (more type checks and copies)Therefore, it's best to avoid std::any in performance-critical code, unless the flexibility it provides is truly necessary. When you do use std::any
, try to minimize the number of times the value is accessed or copied.
Remember, premature optimization is the root of all evil. Use concrete types by default, and only introduce std::any
when the need for runtime polymorphism is clear and justified.
Answers to questions are automatically generated and may not have been reviewed.
std::any
Learn how to use void pointers and std::any
to implement unconstrained dynamic types, and understand when they should be used