问题标签 [restrict-qualifier]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2213 浏览

c++ - MSVC++ 限制关键字和局部变量

我已经阅读了许多关于restrict关键字的帖子。但几乎我能找到的每个示例似乎都只将输入参数引用到一个函数,也许是一个值。我需要澄清我的理解。

我发现一个函数看起来完全违反了带有输入参数和局部变量的关键字规则。

这个函数被调用void*到一个缓冲区并且指针被声明为__restrict(这是Microsoft Visual C++)。然而,在函数的后面,UCHAR*声明了一个类型的局部变量指针,并使其指向相同的受限输入参数缓冲区。

这是我正在谈论的功能的一个严重削减的版本:

上面的例子是否违反了规则restrict

0 投票
2 回答
3609 浏览

c++ - 为什么我收到错误消息:“限制”不允许?

我正在编写一个 CUDA 内核并想要__restrict__我的一些参数。我收到错误消息:

"restrict" is not allowed

某些变量类型不允许吗?对于一些参数组合?因为一些编译器标志?因为我调皮?

简化的内核签名:

0 投票
3 回答
937 浏览

c - 别名“const restrict”指针参数是否合法?

如果dot_product声明为

会用

根据 C99 标准,是“未定义”吗?

编辑

x是一个指针,当然是指向sizeof(float) * x_len内存字节的,x_lenunsigned。这个问题是关于别名的。

0 投票
1 回答
190 浏览

visual-c++ - 专门针对 C++AMP 受限 lambda 的模板

使用这个问题(以及其他一些问题)的洞察力,我已经能够编写以下内容来询问正常的 lambda 函数类型信息(即返回类型、参数计数等)

然后我可以使用它,lambda_traits<decltype(myLambda)>但这就是我自鸣得意的编码结束的地方,因为如果我的 lambda 是 gpu 的放大器限制,即

显然没有选择模板专业化。但是添加新的专业

仍然没有解决问题,因为我发现编译器吠叫

是否有另一种方法来询问 lambdas 中的类型,或者有一种方法可以去除 lambda 类型的限制?

0 投票
2 回答
3526 浏览

c++ - 为什么限制关键字不是 C++ 的一部分?

标题说明了一切。我很好奇为什么限制关键字不是 C++ 的一部分?我对 C++ 了解不多,而且我仍然无法在网上找到任何可以阻止它的理由。如果 C++ 标准会像 C 那样使用这个关键字,有谁知道会发生什么可怕的事情?它根本不需要吗?

更多解释:这不是关于使用它,也许我这辈子都不会从这个关键字中受益。这个问题只是关于好奇心,因为从 C99 开始,restrict 是 C 的一部分,也就是 15 年。

另请阅读:我对技术原因感兴趣,而不是像“他们只是不喜欢,这还不够酷”之类的观点

0 投票
1 回答
1566 浏览

c++ - 使用限制关键字摆脱函数上的“类型限定符”警告

我正在尝试清理编译 Blitz++ 时收到的警告:

从这些类型的成员函数(TinyVector类的)

restrict据我所知,由于关键字,我收到了警告。注意:有些宏应该替换为restrict__restrict__g++ 可以理解)。

我可以通过删除关键字来摆脱警告;但是,由于这应该是一个高性能数值库,我不想丢失restrict关键字允许的任何编译器优化。

我能做些什么来抑制这些警告,而不仅仅是restrict完全删除 ' 并-Wall继续?

0 投票
2 回答
181 浏览

c++ - 在哪些情况下,应用于返回值的限制限定符会产生影响?

如果我有一个像这样声明的成员函数:

限制关键字可以做任何事情吗?

显然,对于 g++(x86 架构)它不能,但是是否有其他编译器/架构可以使这种类型的构造有意义,并允许优化机器代码生成?

我问是因为 Blitz 库 (Blitz++) 有一大堆以这种方式声明的函数,除非它真的做某事,否则有人会进入并添加限制关键字是没有意义的。因此,在我进入并删除restrict's(以摆脱编译器警告)之前,我想知道我是如何滥用代码的。

0 投票
0 回答
193 浏览

c++ - __restrict 在 g++ 和 MSVC 中使用数组语法

我正在更新要使用的性能关键库restrict,正如 g++ 和 MSVC 在 C++11 中使用关键字实现的那样__restrict

有很多例程和函数看起来像:

在上面的例子中,f是一个参数应该被限制的例程。不幸的是,据我所知,在保持这种语法的同时这是不可能的。现在,显然这可以使用指针重写为:

这里丢失的是ab是数组的语义事实(我更喜欢对单值指针使用指针表示法,对数组指针使用数组表示法)。描述性参数名称(上面省略)有帮助,但也只有这么多。

我想确认这些编译器目前无法使用数组语法声明受限变量。

0 投票
1 回答
1215 浏览

c++ - C++ 限制语义

我正在更新性能关键库以使用限制,正如 g++ 和 MSVC 在 C++11 中使用关键字实现的那样__restrict。这似乎是最标准的扩展,所以我将使用restrict__restrict互换。

restrict是一个 C99 关键字,但是编译器已经在 C++ 中定义了它的重要用途。

这篇文章打算成为一个“问题”,询问每个 C++ 特定用途是什么以及它的含义,然后是一个 CW 答案来回答它。随意添加/检查/编辑。所以:“帮助!这些 C++ 使用的restrict关键字是什么意思?”

  1. 限定this(限制方法):

    /li>
  2. 限制引用:

    /li>
  3. 限制在模板内:

    /li>
  4. 限制成员/字段。这在技术上也适用于 C struct,但它在 C++ 中比在 C 中更频繁地出现:

    /li>
0 投票
2 回答
156 浏览

c - Granularity of restrict qualifier for overlapping pointers, types

The whole point of restrict is to promise accesses through one pointer don't alias another. That said, there are examples where overlapping memory addresses wouldn't imply aliasing. For example:

The thing is, these pointers actually do point to overlapping memory! For this particular example, guides like this say, e.g.:

It is valid . . . to point into the same array object, provided the range of elements accessed through one of the pointers does not overlap with the range of elements accessed through the other pointer.

My question is: What granularity is "elements"?

For example, suppose I have an array of type struct Foo. Do I really need to ensure that I don't access the same range of elements (Foos), even if the parts I access are disjoint? Here's a simple, scalar example:

You can run into similar issues with pointers to different types (e.g. char vs. int), but perhaps the structure example above is more clear.