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

时间:2018-10-29 05:52:05

标签: c++ optimization boost std-pair

我检查了libcxxeastlboost,他们所有的配对都是琐碎的,没有ebco。但是所有这些人也都实现了自己的compressed_pair,并在实用程序(例如unique_ptr(first -> pointer, second -> deleter)中使用它。

现在ebco很有用,为什么默认情况下不压缩它们的配对?此优化需要权衡吗?

2 个答案:

答案 0 :(得分:2)

std::pair的实现不能使用empty base optimization(EBO),因为它包含的对象是成员子对象firstsecond,而EBO仅适用于基类子对象

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

答案 1 :(得分:1)

约瑟夫·汤姆森回答了问题。

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

如果可能的话,请定义一个struct,而不要使用任何构造函数或分配来获得最佳性能。这也允许人类可读的名称。 The rule of zero是您表现最好的朋友。