问题标签 [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 投票
5 回答
7398 浏览

c++ - 如果指针已标记为 const,是否限制 C 中的帮助?

只是想知道:当我向指针添加限制时,我告诉编译器该指针不是另一个指针的别名。假设我有一个类似的功能:

如果编译器必须假设result可能与 重叠a,则它必须每次重新获取 a。但是,正如a所标记const的,编译器也可以假设 a 是固定的,因此获取它一次是可以的。

问题是,在这种情况下,使用限制的推荐方法是什么?我当然不希望编译器a每次都重新获取,但我找不到关于restrict应该如何在这里工作的好信息。

0 投票
2 回答
58173 浏览

c - C99 'restrict' 关键字的实际用法?

我正在浏览一些文档和问题/答案,并看到它被提及。我阅读了一个简短的描述,指出这基本上是程序员的一个承诺,即指针不会用于指向其他地方。

任何人都可以提供一些实际使用它的实际案例吗?

0 投票
7 回答
125185 浏览

c++ - C++中的restrict关键字是什么意思?

我一直不确定,C++ 中的 restrict 关键字是什么意思?

这是否意味着赋予函数的两个或多个指针不重叠?还有什么意思?

0 投票
3 回答
8437 浏览

c - 何时使用限制,何时不使用

我对此有一个大致的了解,restrict但我希望能澄清一些要点。我有一个函数,它从一个缓冲区读取一个以空字符结尾的字符串,并在另一个缓冲区中写出一个 URL 编码版本。该函数有这个签名(目前没有restrict):

unencoded是我的以 null 结尾的源字符串。目标缓冲区由encodedand表示encodedEnd,其中encoded指向缓冲区中的第一个字符charencodedEnd指向缓冲区之后的第一个字符,即该函数将chars 写入但不包括指向的位置encodedEnd- 这是您的基本begin/end迭代器如果您熟悉 C++ STL 约定,请配对。

如果我添加restrict到这个函数,它应该只应用于前两个参数:

或者将它添加到所有三个参数中是否有一些我不理解的好处?

我可以看到制作输入和输出缓冲区restrict有助于编译器知道它们不重叠。但由于最后一个参数 ,encodedEnd仅用于标记输出缓冲区的结束,我认为这restrict对编译器没有任何帮助(尽管我认为它不会伤害,除了增加不必要的噪音到函数声明)。

0 投票
3 回答
387 浏览

c - c99之前的限制性

考虑到这段代码,VC9 没有检测到别名:

明显的解决方法是使用临时的:

这是标准行为吗?我期待编译器,除非被告知,否则会假设两个指针都可能有别名。

0 投票
1 回答
2264 浏览

c++ - 使用限制关键字出错

在以下示例中:

我收到此错误:

我用 -std=c99 编译,使用 gcc 3.4

有任何想法吗?

0 投票
3 回答
2673 浏览

c - 关于指向指针的指针,C99 的“限制”的语义是什么?

我正在做很多矩阵运算,并希望利用 C99 的restrict指针限定符。

我想将我的矩阵设置为指向指针的指针,以便于下标,如下所示:

现在,对于矩阵乘法函数

我必须将参数的两个指针都限定为受限吗?这是有效的语法,但我很难确定int *restrict *restrict其行为是否与int **restrict.

那么,在正确限制指针的情况下,是否通过A[0][col*nrows + row]undefined 访问元素?(即,编译器是否会假设我通过这样A[col][row]的值访问矩阵)?还是我必须保持一致?rowrow < nrow

0 投票
6 回答
2558 浏览

c - What can human beings make out of the restrict qualifier?

If I got the C99 restrict keyword right, qualifying a pointer with it is a promise made that the data it references won't be modified behind the compiler's back through aliasing.

By contrast, the way I understand the const qualifier is as compiler-enforced documentation that a given object won't be modified behind the back of a human being writing code. The compiler might get a hint as a side effect, but as a programmer I don't really care.

In a similar way, would it be appropriate to consider a restrict qualifier in a function prototype as a requirement that the user ensures exclusive access ("avoid aliasing", or maybe something stronger) for the duration of the call? Should it be used as "documentation"?

Also, is there something to understand in the fact that restrict qualifies a pointer rather than the data it points to (as const does) ?

EDIT: I originally believed that restrict could have implications with threaded code, but this seems wrong so I remove references to threads from the question to avoid confusing readers.

0 投票
5 回答
16416 浏览

c++ - 限制关键字是否在 gcc/g++ 中提供了显着的好处?

有没有人见过关于restrict在 gcc/g++ 中使用 C/C++ 关键字是否在现实中(而不仅仅是在理论上)提供任何显着的性能提升的任何数字/分析?

我已经阅读了各种推荐/贬低其使用的文章,但我没有遇到任何实际证明双方论点的实数。

编辑

我知道这restrict不是 C++ 的正式组成部分,但它受到一些编译器的支持,而且我读过Christer Ericson的一篇论文,强烈推荐使用它。

0 投票
1 回答
8156 浏览

c++ - C/C++ __restrict 类型

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

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

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