C / C ++ __restrict类型

时间:2010-05-01 03:51:28

标签: c++ c restrict-qualifier

有没有办法定义使用typedef integral / float类型,这意味着没有别名?

等同于(但是原始构造)的东西:

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

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

1 个答案:

答案 0 :(得分:20)

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

C ++ 1998标准规定“typedef说明符不应......在 decl-specifier-seq 中与任何类型的说明符组合,除了类型 - 符“。基本上,它必须是类型说明符的列表,其中包括两个 cv-qualifiers constvolatile

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以来的限制语法,但在version 4.5之前它确实没有执行适当的优化。