c++ - 编译器能内联这个方法吗?

标签 c++ performance oop vector inline

当前数据结构

我有一个代码,其中数据结构由两个类 vector 表示 A1A2分别。

vector<A1> v1;
vector<A2> v2;

我的代码中较慢的部分(大约占总运行时间的 80%)在于遍历这些 vector 并应用方法 funA1关于 v1 的元素和 funA2关于 v2 的元素.

double result = 0;
for (int i = 0 ; i < v1.size() ; i++)
{
  results *= v1[i].funA1();
}
for (int i = 0 ; i < v2.size() ; i++)
{
  results *= v2[i].funA2();
}

reshape 数据结构

虽然数据结构使用这两个 vector ,但直觉宁愿使用混合数据类型 A1 的单个 vector 。和 A2 .使用两个不同的 vector 会导致代码其他地方的可读性和维护性下降。

我想我可以将它们合并成一个 vector 。这个想法是制作A1A2父类的 sibling 类 A并使用 vector<A> v作为单个 vector 。我会定义一个虚拟的 fun在类里面A并在 A1 中覆盖它和 A2这样我就可以做

double result = 0;
for (int i = 0 ; i < v.size() ; i++)
{
  results *= v[i].fun();
}

问题

在第一种情况下,方法 funA1funA2可以由编译器内联(实际上我自己内联了它们,因为它们是非常简单的函数)。

在第二种情况下,恐怕内联是不可能的。它是否正确?

编译器会设法内联方法吗 fun ?

当然,性能损失可能可以忽略不计,我应该对其进行测试,但我想知道在尝试进行所有修改之前它是否值得先验。

最佳答案

答案是肯定的“也许”。判断您的编译器是否确实内联调用的唯一方法是编译它,然后查看汇编列表。这完全取决于 fun 的复杂性(其中“复杂性”是一个非常特定于编译器的指标)。

就个人而言,除非这是您应用程序中时间最关键的部分,否则我不会担心它。函数调用并不那么昂贵。与往常一样,编写代码时要确保清晰性和可读性,然后再进行优化。

关于c++ - 编译器能内联这个方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42920629/

相关文章:

c++ - 如何防止 boost logger 在每条记录后添加\n?

java - 使用 try-catch over if 条件以在 java 中以最小的性能影响安全地设置值

javascript - 提高 JavaScript 速度

JavaScript 局部变量。如何在圆圈中引用

c++ - 在 boost::spirit::lex 中,第一次解析花费的时间最长,后续解析的时间会短得多

javascript - 我可以通过 javaScript 运行可执行文件吗?

database - 不守规矩的磁盘使用,不会缩水

Ruby风格问题: blocks or inheritance?

java - 限制枚举潜在值的方法

C++ 变量参数错误