【发布时间】:2017-03-21 07:20:45
【问题描述】:
当前数据结构
我有一个代码,其中数据结构分别由类A1 和A2 的两个向量表示。
vector<A1> v1;
vector<A2> v2;
我的代码中缓慢的部分(大约占总运行时间的 80%)在于迭代这些向量,并对 v1 的元素和 funA2 的元素应用 funA1 方法 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();
}
重塑数据结构
虽然数据结构使用这两个向量,但直觉上宁愿使用混合数据类型A1 和A2 的单个向量。使用两个不同的向量会导致代码中其他地方的可读性和维护性下降。
我想我可以将它们合并成一个向量。想法是使父类A 的A1 和A2 兄弟姐妹类,并使用vector<A> v 作为单个向量。我会在A 类中定义一个虚拟fun 并在A1 和A2 中覆盖它,这样我就可以这样做了
double result = 0;
for (int i = 0 ; i < v.size() ; i++)
{
results *= v[i].fun();
}
问题
在第一种情况下,方法funA1和funA2可以被编译器内联(实际上我自己内联了它们,因为它们是非常简单的函数)。
在第二种情况下,恐怕内联是不可能的。它是否正确?
编译器会设法内联方法fun吗?
当然,性能损失可能可以忽略不计,我应该对其进行测试,但我想知道在尝试进行所有修改之前是否值得先验。
【问题讨论】:
-
如果您担心可读性,那么也许使用带有 lambda 的
std::accumulate会比您的循环更好? -
您必须使用
vector<A*> v。如果你使用vector<A> v,你就有对象切片。
标签: c++ performance oop vector inline