💡
原文中文,约2700字,阅读约需7分钟。
📝
内容提要
C++17 引入的 std::any 提供了灵活的类型擦除,但性能开销较大。其通过 _M_storage 存储数据和 _M_manager 管理类型信息,小对象在栈上存储,大对象在堆上分配,导致内存利用率低。总体而言,尽管灵活性高,但在内存和性能上存在一定的开销。
🎯
关键要点
-
C++17 引入了 std::any,提供灵活的类型擦除,但伴随性能开销。
-
std::any 的实现涉及异构数据存储和类型安全访问。
-
核心变量 _M_storage 用于存储数据,_M_manager 管理类型信息。
-
小对象在栈上存储,大对象在堆上分配,导致内存利用率低。
-
内存结构设计存在潜在浪费,存储 1 字节数据时空间利用率仅 6.25%。
-
通过 _M_manager 函数指针实现类型信息的获取,节省内存开销。
-
总体而言,尽管灵活性高,但在内存和性能上存在一定的开销。
❓
延伸问答
std::any 的主要功能是什么?
std::any 提供了灵活的类型擦除,可以将任意类型的变量安全地存储。
std::any 的实现中存储数据的核心变量是什么?
核心变量是 _M_storage,用于存储数据值本身或指针。
小对象和大对象在 std::any 中是如何存储的?
小对象在栈上存储,大对象在堆上分配,使用 _M_storage 来管理。
std::any 的内存利用率如何?
在 64 位机器上,存储 1 字节数据时,空间利用率仅为 6.25%。
std::any 如何实现类型安全访问?
通过 _M_manager 函数指针实现类型信息的获取,结合 template class 的静态函数。
使用 std::any 有哪些性能开销?
使用 std::any 会有内存开销和性能开销,尤其是大对象会触发堆分配。
➡️