为什么大多数 pair 实现默认不使用压缩(空基优化)?



我检查了libcxx、eastl和boost,它们的对都是琐碎的,没有ebco。但是,它们也都实现了自己的compressed_pair,并在实用程序中使用它,例如unique_ptr(第一个->指针,第二个->删除器(。

既然ebco很有用,为什么它们的对默认情况下不压缩呢?这种优化是否有任何权衡?

std::pair的实现不能使用空基优化(EBO(,因为它包含的对象是成员子对象firstsecond,并且EBO仅适用于基类子对象

请注意,std::tuple的实现可以使用EBO,因为它的子对象是通过std::get公开的,这允许使用基类子对象。

Joseph Thomson回答了这个问题。

我想补充一点,如果性能很重要,std::pairstd::tuple不是你的朋友。这些类定义了构造函数和赋值,这些构造函数和赋值使它们成为非平凡/POD类,即使它们包含平凡/POD成员,这也排除了对标准库中平凡/POD类别的所有优化。

如果可能的话,定义一个不带构造函数或赋值的struct以获得最佳性能。这也允许使用人类可读的名称。零法则是你最好的表现朋友。

最新更新