A deep dive into SmallVector:push_back
13 days ago
- #push_back optimization
- #C++ containers
- #SmallVector
- SmallVector::push_back 通过尾调用一个外部慢路径,为平凡可复制的元素类型进行了优化,从而在快速路径上消除了栈帧和调用者保存寄存器的溢出。
- 这项优化使指令数减少了 0.41–0.51%,并压缩了 .text 段 40,512 字节,但二进制大小略微增加了 0.13%,并且由于内联变化,某些异常情况导致体积增大。
- 与 std::vector、boost::small_vector 和 absl::InlinedVector 的比较显示,它们在快速路径上会产生栈帧,而 SmallVector 的设计以元数据大小为代价换取了更好的热路径性能。
- 双重权衡:单个 push_back 受益于无栈帧,但循环则因外部调用中的地址逃逸导致元数据留在内存中而受到影响。
- SmallVector 采用五层类层次结构来分离关注点,从而以最小的每类型开销实现高效的代码生成,并且对于许多类型,其头文件比 std::vector 更小。