11

有没有办法使用 typedef 整数/浮点类型来定义,这意味着没有别名?

相当于(但原始构造)的东西:

template < typename T >
struct restrict { T* __restrict data; };

作为相关问题,是否可以问 gcc 它确定指针的别名/无别名是什么?

4

1 回答 1

20

如评论中所述,许多较新的 C++ 编译器确实支持限制类型限定符的 C99 实现。由于restrict不是 C++ 中的保留关键字,因此编译器通常使用__restrictor __restrict__GCCVisual C++都很好地记录了这一点,并明确引用了 C99。

C++ 1998 标准规定“typedef说明符不应......在decl-specifier-seq中与除类型说明符之外的任何类型的说明符组合。” 本质上,它必须是一个类型说明符列表,其中包括两个cv-qualifiers和. 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();
}

这只是利用了这样一个事实,即如果link_fail在目标文件中找到未解析的符号,链接器将抛出错误。如果编译器正确地限制了这两个参数,那么它应该知道 的值a,即使在b更改之后也是如此。因此,它应该从生成的目标文件中删除整个 if 块,因为它永远不会运行。

请注意,尽管 GCC 至少从 3.0 版开始支持限制语法,但直到4.5 版才真正执行适当的优化。

于 2010-05-01T08:08:45.350 回答