【发布时间】:2015-07-24 02:17:06
【问题描述】:
在这个Stack Overflow answer 证明了 C++ 中的别名可以减慢您的代码。 C++ 中的别名不仅适用于指针,也适用于引用,更普遍地适用于these types specified by the standard。特别是有
在其成员中包含上述类型之一的聚合或联合类型(递归地包括子聚合或包含联合的成员)
所以根据我的理解,如果我有如下代码,
class A{
public:
int val;
};
void foo(vector<A> & array, int & size, A & a0) {
for(int i=0;i<size;++i) {
array[i].val = 2*a0.val;
}
}
并且a0 可以为array 中的元素之一加上别名,也可能因为前面提到的引用而别名size,因此必须为每次迭代加载a0 和size在性能下降。
- 那么我的问题是我应该对代码做些什么来避免别名,并提高性能?
- 传递
const &将无济于事,因为它无法避免标准指定的别名。按值传递a0?但这会复制我不喜欢的a0,因为在实践中,A类可能非常复杂,并且复制是一个非常昂贵的选择。 - 是否有避免在 C++ 中出现别名的通用解决方案?如果是,是什么?
【问题讨论】:
-
我在此处引用的提案来自 Clark Nelson is relevant,尽管这是一个 C 提案,但他提到它也与 WG21(C++) 相关,尽管他没有时间提供 WG21 措辞。
-
我对别名行为不太熟悉,但对我正在阅读的内容不太熟悉,只要可以向编译器证明函数需要读取的值不是彼此的潜在别名根据规则,它应该避免每次刷新值的开销。例如,在这个例子中(我可能是错的)不应该有别名,因为
int、vector<A>和A不是可以相互引用的类型,除了指向int&的int&指向A::val。 -
@XerenNarcy
a0可能是对array的元素之一的引用 -
@MattMcNabb 公平点,完全掩盖了这一点......