为什么 pair 的大多数实现默认不使用压缩(空基优化)?
Why most implementations of pair don't use compression (empty base optimization) by default?
我检查过 libcxx, eastl and boost, all of their pairs are trivial, no ebco. But all of them also implement their own compressed_pair and use it in utilities, unique_ptr(first -> pointer, second -> deleter) 例如。
既然ebco好用,为什么他们的pair默认不压缩呢?这个优化有什么取舍吗?
std::pair
cannot use empty base optimization (EBO) 的实现,因为它包含的对象是 成员子对象 、first
和 second
,以及 EBO仅适用于 base class 子对象.
请注意 std::tuple
can use EBO, as its subobjects are exposed via std::get
的实现,它允许使用基础 class 子对象。
约瑟夫汤姆森回答了问题。
我想补充一点,如果性能很重要,std::pair
和 std::tuple
不是你的朋友。这些 类 定义了使它们成为 non-trivial/non-POD 类 的构造函数和赋值,即使它们包含 trivial/POD 成员,这排除了对 trivial/POD 类 中的所有优化标准库。
如果可能,请改为定义 struct
没有构造函数或赋值以获得最佳性能。这也允许人类可读的名称。 The rule of zero 是你最好的性能朋友。
我检查过 libcxx, eastl and boost, all of their pairs are trivial, no ebco. But all of them also implement their own compressed_pair and use it in utilities, unique_ptr(first -> pointer, second -> deleter) 例如。
既然ebco好用,为什么他们的pair默认不压缩呢?这个优化有什么取舍吗?
std::pair
cannot use empty base optimization (EBO) 的实现,因为它包含的对象是 成员子对象 、first
和 second
,以及 EBO仅适用于 base class 子对象.
请注意 std::tuple
can use EBO, as its subobjects are exposed via std::get
的实现,它允许使用基础 class 子对象。
约瑟夫汤姆森回答了问题。
我想补充一点,如果性能很重要,std::pair
和 std::tuple
不是你的朋友。这些 类 定义了使它们成为 non-trivial/non-POD 类 的构造函数和赋值,即使它们包含 trivial/POD 成员,这排除了对 trivial/POD 类 中的所有优化标准库。
如果可能,请改为定义 struct
没有构造函数或赋值以获得最佳性能。这也允许人类可读的名称。 The rule of zero 是你最好的性能朋友。