我检查了libcxx、eastl和boost,它们的对都是琐碎的,没有ebco。但是,它们也都实现了自己的compressed_pair,并在实用程序中使用它,例如unique_ptr(第一个->指针,第二个->删除器(。
既然ebco很有用,为什么它们的对默认情况下不压缩呢?这种优化是否有任何权衡?
std::pair
的实现不能使用空基优化(EBO(,因为它包含的对象是成员子对象、first
和second
,并且EBO仅适用于基类子对象。
请注意,std::tuple
的实现可以使用EBO,因为它的子对象是通过std::get
公开的,这允许使用基类子对象。
我想补充一点,如果性能很重要,std::pair
和std::tuple
不是你的朋友。这些类定义了构造函数和赋值,这些构造函数和赋值使它们成为非平凡/POD类,即使它们包含平凡/POD成员,这也排除了对标准库中平凡/POD类别的所有优化。
如果可能的话,定义一个不带构造函数或赋值的struct
以获得最佳性能。这也允许使用人类可读的名称。零法则是你最好的表现朋友。