Any*_*orn 11 c c++ restrict-qualifier
有没有办法定义使用typedef integral/float类型,这意味着没有别名?
相当于(但原始构造)的东西:
template < typename T >
struct restrict { T* __restrict data; };
Run Code Online (Sandbox Code Playgroud)
作为相关的问题,是否可以问gcc它确定别名/指针的别名是什么?
Mat*_* B. 20
正如评论中所指出的,许多较新的C++编译器确实支持限制类型限定符的C99实现.由于restrict在C++中不是保留关键字,编译器通常使用__restrict或__restrict__.无论GCC和VISUAL C++文件这很好,具有C99明确提及.
C++ 1998标准规定" 除了类型说明符之外," typedef说明符不应该与除了类型说明符之外的任何类型的说明符组合在一个decl-specifier-seq中." 本质上,它必须是一个类型说明符列表,其中包括两个cv限定符,以及. constvolatile
C99类似地定义了typedef,除了它的限定符列表包括restrict.
在非标准的typedef中预测类似的支持似乎是合理的__restrict......但你永远不会知道!
一种巧妙而简单的测试方法如下:
extern void link_fail();
typedef int *__restrict restricted_int_p;
void test(restricted_int_p a, restricted_int_p b) {
*a = 1;
*b = 2;
if (*a == 2) link_fail();
}
Run Code Online (Sandbox Code Playgroud)
这简单地利用了如果link_fail在目标文件中找到未解析的符号,链接器将抛出错误的事实.如果编译器正确地限制了两个参数,那么它应该知道的值a,即使在b更改之后也是如此.因此,它应该从生成的目标文件中剥离整个if块,因为它永远不会被运行.
请注意,虽然GCC至少支持版本3.0以来的限制语法,但它确实在版本4.5之前没有执行适当的优化.