当前数据结构
我有一个代码,其中数据结构由两个类 vector 表示 A1
和 A2
分别。
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 。这个想法是制作A1
和 A2
父类的 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();
}
问题
在第一种情况下,方法 funA1
和 funA2
可以由编译器内联(实际上我自己内联了它们,因为它们是非常简单的函数)。
在第二种情况下,恐怕内联是不可能的。它是否正确?
编译器会设法内联方法吗 fun
?
当然,性能损失可能可以忽略不计,我应该对其进行测试,但我想知道在尝试进行所有修改之前它是否值得先验。
最佳答案
答案是肯定的“也许”。判断您的编译器是否确实内联调用的唯一方法是编译它,然后查看汇编列表。这完全取决于 fun
的复杂性(其中“复杂性”是一个非常特定于编译器的指标)。
就个人而言,除非这是您应用程序中时间最关键的部分,否则我不会担心它。函数调用并不那么昂贵。与往常一样,编写代码时要确保清晰性和可读性,然后再进行优化。
关于c++ - 编译器能内联这个方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42920629/