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