首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C/C++ __restrict类型

C/C++ __restrict类型
EN

Stack Overflow用户
提问于 2010-05-01 11:51:28
回答 1查看 8.1K关注 0票数 11

有没有一种方法来定义使用类型定义整型/浮点型,这意味着没有别名?

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

代码语言:javascript
复制
template < typename T >
struct restrict { T* __restrict data; };

作为相关的问题,能不能问一下gcc,它确定指针的别名/无别名是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-01 16:08:45

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

C++ 1998标准规定:“typedef说明符不应...与除类型说明符以外的任何类型的说明符组合在decl说明符序列中。”本质上,它必须是类型说明符的列表,其中包括两个cv限定符constvolatile

除了它的限定符列表包括restrict之外,C99定义了类似的类型定义。

在typedefs中预期对非标准__restrict的类似支持似乎是合理的……但是你永远不会知道!

下面是一种聪明而简单的方法来测试它:

代码语言:javascript
复制
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块,因为它永远不会运行。

请注意,尽管从3.0版开始,GCC就支持restrict语法,但直到version 4.5,它才真正执行正确的优化。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2748818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档