C++类型擦除优化与成本分析
1. 小缓冲区优化(SBO)
在类型擦除实现中,小缓冲区优化(SBO)是一种有效的优化手段。以 Shape 类为例,它现在存储了一个给定存储策略的实例和一个指向其概念的原始指针。代码如下:
[[no_unique_address]] StoragePolicy policy_{};
Concept* pimpl_{};
这里的 no_unique_address 属性是C++20的特性,它可以节省存储策略的内存。如果策略为空,编译器可以不为该数据成员预留任何内存。若没有此属性,由于对齐限制,至少需要为 policy_ 预留一个字节,可能更多。
许多标准类型,如 std::function 和 std::any ,都使用了某种形式的SBO。不过,C++标准库规范并不要求使用SBO,所以我们只能期望它被使用,而不能依赖它。目前已经有提案建议将 inplace_function 和 inplace_any 类型标准化。
2. 手动实现函数调度
2.1 虚拟函数调用的开销
虚拟函数调用涉及两次间接寻址:首先通过 vptr 获取虚拟函数表,然后从虚拟函数表中获取实际函数指针并调用。因此,大致来说,虚拟函数调用的开销是常规非内联函数调用的两倍。
超级会员免费看
订阅专栏 解锁全文
1633

被折叠的 条评论
为什么被折叠?



