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