只是想知道是否有人会为我确认一些别名规则。C++别名规则
我知道,混叠(即加载存储问题)可能导致以下类型的代码是次优的,因为我们不能假设x, y, z
不重叠:
// case 1:
void plus(size_t n, double *x, double *y, double *z)
{
for (size_t i = 0; i != n; ++i)
z[i] = x[i] + y[i];
}
我知道这有一个C关键字__restrict
这暗示到,它不应该考虑重叠的情况下,编译,因此潜在生成更好的代码:
// case 2:
void plus(size_t n, double *__restrict x, double *__restrict y, double *__restrict z)
{ // as above... }
但是别名如何处理C++风格的代码,我们将在那里处理通过引用传递的容器对象,而不是上面类似于C的示例中的原始指针?
举例来说,我猜想会有走样的问题,如果我们做了以下内容:
// case 3:
void plus(std::vector<double> &x, std::vector<double> &y, std::vector<double> &z)
{ // similar to above... }
并移动到一个不太简单的例子,这有什么区别,如果基础数据类型容器是不同的?在执行层面最集装箱动态管理与指针存储,所以它不是很清楚,我的编译器如何能确保以下不别名:
// case 4:
void foo(std::vector<mytype1> &x, std::vector<mytype2> &y)
{ // interwoven operations on x, y... }
我并不想对微型优化,但我想知道现在是否更好地将限制指针传递到容器周围,而不是引用。
编辑:清除一些术语,如指出:restrict
是C99关键字。在各种编译器中也有__restrict
和__restrict__
,但它们都做同样的事情。
对于容器的例子,除非'&x ==&y'我不相信它们有任何可以重叠的方式,假设符合标准的矢量实现。 – Sven 2011-06-12 07:52:05
@Sven:不同的std :: vector不重叠,但是通常你可以通过引用传递任何对象类型,可能是重叠的。所以我希望编译器需要确保正确性,并保守假设有别名。这就是为什么__restrict进来... – 2011-06-12 07:59:13
@Darran:实际上编译器会做矢量优化或什么时候传递一个对象重载operator [],而不是一个实际的数组或指针?不知何故,我怀疑它。 – Sven 2011-06-12 08:09:03