C / C ++ __restrict类型
有没有办法定义使用typedef integral / float类型,这意味着没有别名?
相当于(但原始构造)的东西:
template struct restrict { T* __restrict data; };
作为相关的问题,是否有可能问gcc它确定别名/指针的别名是什么?
正如评论中所指出的,许多较新的C ++编译器确实支持限制类型限定符的C99实现。 由于restrict
不是C ++中的保留关键字,因此编译器通常使用__restrict
或__restrict__
。 GCC和Visual C ++都很好地记录了这一点,并明确引用了C99。
C ++ 1998标准声明“ typedef
说明符不应该在除了类型说明符之外的任何类型的说明符中与decl-specifier-seq组合。” 本质上,它必须是一个类型说明符列表,其中包括两个cv限定符 , const
和volatile
。
C99类似地定义了typedef,除了它的限定符列表包括restrict
。
在非标准的__restrict
预测typedef中的类似支持似乎是合理的……但你永远不知道!
一种巧妙而简单的测试方法如下:
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(); }
这简单地利用了如果在目标文件中找到未解析的link_fail
符号,链接器将抛出错误的事实。 如果编译器正确地限制了两个参数,那么它应该知道a的值,即使在b
被更改之后也是如此。 因此,它应该从生成的目标文件中剥离整个if块,因为它永远不会运行。
请注意,尽管GCC至少支持版本3.0的限制语法,但它确实在版本4.5之前没有执行适当的优化。