我正在更新性能关键库以使用限制,如 g++ 和 MSVC 在 C++11 中使用关键字实现的那样__restrict
。这似乎是最标准的扩展,所以我将使用restrict
and __restrict
可以互换。
restrict
是一个 C99 关键字,但编译器已经在 C++ 中定义了它的重要用途。
这篇文章旨在成为一个“问题”,询问每个 C++ 特定用途是什么及其含义,然后是一个 CW 答案来回答它。请随意添加/检查/编辑。所以:“救命!这些 C++ 使用什么?restrict
关键词是什么意思?”
-
资格赛this
(限制方法):
void Foo::method(int*__restrict a) __restrict { /*...*/ }
-
限制引用:
int&__restrict x = /*...*/;
-
限制在模板内:
std::vector<float*__restrict> x;
-
限制成员/字段。这在技术上也适用于 Cstruct
,但它在 C++ 中比在 C 中更频繁地出现:
class Foo final { public: int*__restrict field; };
-
资格赛this
(限制方法):
这意味着this
指针受到限制。这一个主要后果是:
-
该方法不能将其自身作为数据进行操作,例如:
void Foo::method(Foo*__restrict other) __restrict { /*...*/ }
在那个例子中,this
否则可能会产生别名other
. restrict
是说你不能用它自己作为参数来调用这个方法。
-
注:是okay访问或更改对象,甚至通过字段。原因是以下功能在功能上是相同的:
void Foo::method1(void) __restrict { field=6; }
void Foo::method2(void) __restrict { this->field=6; }
在那个例子中,this
没有任何别名。
-
限制引用:
它的意思似乎正是——引用受到限制。这到底是什么does而它是否有用则是另一回事。有人在这个线程 http://www.gamedev.net/topic/569075-__restrict-on-c-references/声称编译器可以静态地确定引用的别名,因此该关键字应该是无用的。这个问题 https://stackoverflow.com/questions/12841279/should-i-use-restrict-on-references还被问及是否应该使用它,但答案“特定于供应商”几乎没有帮助。
-
-
有先例这个问题 https://stackoverflow.com/questions/13307190/restrict-keyword-and-pointers-inside-structs。简而言之,在功能上f
,编译器知道a.field
and b.field
没有别名:
class Foo final {
int*__restrict field;
};
int f(Foo a, Foo b) { /*...*/ }
经常会出现这种情况,假设a!=b
--例如,如果字段由 Foo 的构造函数/析构函数分配和销毁。请注意,如果 field 是原始数组,则它将始终为 true,因此restrict
关键字是不必要的(并且不可能 https://stackoverflow.com/questions/25929162/restrict-in-g-and-msvc-with-array-syntax) 申请。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)