在 C++ 中,最好不要对使用 RTTI 的函数参数使用按值传递?

In C++, better not to use pass-by-value for function arguments that use RTTI?

提问人:Xlv 提问时间:6/25/2019 最后编辑:Xlv 更新时间:6/25/2019 访问量:104

问:

根据 Agner Fog (2018-08-18) 第 50 页的“在 C++ 中优化软件”,如果不满足这些条件中的任何一个,那么将指针或引用转移到对象通常更快。

  1. 该对象非常小,可以放入单个寄存器中
  2. 对象没有复制构造函数,也没有析构函数
  3. 对象没有虚拟成员
  4. 对象不使用运行时类型标识 (RTTI)

前 2 个条件背后的原因相当明显。 第三个条件是由于添加到对象的 vptr,这将使其“太大”而无法有效地传递值。这是对的吗?

任何人都可以解释一下第四个条件吗?

C++ 按引用传递 函数 按值传递 指针

评论

0赞 SergeyA 6/25/2019
不知道作者的意思,但我会对他们的建议持保留态度 - 例如,使用 AMD ABI,即使是不适合单个寄存器的对象也可以有效地传递到寄存器中 - 它只会使用多个。它仍然比通过指针/引用间接更好。示例:gcc.godbolt.org/z/l2Zg8_
0赞 Michael Chourdakis 6/25/2019
RTTI 表示包含类型信息,因此 sizeof(object) > sizeof(register)。
0赞 Severin Pappadeux 6/25/2019
你是说第四个条件?RTTI 需要额外的指针
3赞 Shawn 6/25/2019
使用虚拟方法按值传递对象会导致它被切片为仅声明的参数类型,这很少是您想要的。它与大小无关。切片也使 RTTI 变得无用。示例:stackoverflow.com/a/25453490/9952196
1赞 Eljay 6/25/2019
我没有读过 Agner Fog 的书,但对于优化,我强烈建议对编译器优化代码进行分析(至少对于代码中性能关键的部分),而不是猜测和猜测编译器的优化器提供了什么以及一个人的更改将对性能产生什么影响。

答: 暂无答案