我检查了libcxx,eastl和boost,它们对都是微不足道的,没有ebco。但是它们所有人也都实现自己的compressed_pair,并在实用程序中使用它,例如unique_ptr(first -> pointer, second -> deleter)。
现在ebco很有用,为什么它们的配对默认不压缩?此优化是否需要权衡?
std::pair
的实现不能使用std::pair
(EBO),因为它包含的对象是成员子对象,empty base optimization和first
,并且EBO仅适用于基类子对象 。
请注意,second
can的实现使用EBO,因为其子对象是通过std::tuple
公开的,允许使用基类子对象。
约瑟夫·汤姆森回答了问题。
我想补充一点,如果性能很重要,std::tuple
和std::get
不是您的朋友。这些类定义了构造函数和赋值,即使它们包含琐碎/ POD成员,也使它们成为非普通/非POD类,这排除了标准库中针对普通/ POD类的所有优化。
[如果可能,请定义没有构造器或分配的std::get
,以获得最佳性能。这也允许人类可读的名称。 std::pair
是您表现最好的朋友。