何时使用 restrict,何时不使用

27

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

I have a general understanding of restrict but I'm hoping to clarify some fine points. I have a function that reads a null-terminated string from one buffer and writes out a URL encoded version in another buffer. The function has this signature (currently without restrict):

char const *StringUrlEncode(char const *unencoded, 
                            char *encoded,
                            char *encodedEnd);
unencoded是我的以空字符结尾的源字符串。目标缓冲区由encodedencodedEnd表示,其中encoded指向缓冲区中第一个char,而encodedEnd指向缓冲区之后的第一个字符,即该函数将写入char直到但不包括encodedEnd所指向的位置--如果您熟悉C++ STL约定,这就是您基本的begin/end迭代器对。

如果我在此函数中添加restrict,是否应仅应用于前两个参数:

char const *StringUrlEncode(char const *restrict unencoded, 
                            char *restrict encoded,
                            char *encodedEnd);

还是我没有理解添加到所有三个参数中有什么好处吗?

我可以看出将输入和输出缓冲区设置为restrict有助于编译器知道它们不重叠。但是由于最后一个参数encodedEnd仅用于标记输出缓冲区的结尾,我想restrict在这里并没有帮助编译器(虽然我认为这不会有害,除了在函数声明中增加不必要的噪音)。

3个回答

15
尝试查看Mike Acton的文章,点击此处旧链接)。 不使用restrict有性能影响以及不正确使用它的后果,所以restrict很让人担心。
在您的情况下,似乎您可以安全地将restrict应用于所有三个指针,因为它们都没有别名相同的内存区域。但是,在第三个指针上使用它几乎没有任何性能好处。

1
我已经读了Mike的文章(现在已经两遍了),这是一个不错的开始,但还有一些问题让我困惑 :-) - Don McCaughey
3
给出的链接无法使用。谷歌建议在http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html(验证日期为2009年9月6日)上更新版本,但这也存在问题。谷歌缓存版本可供使用。 - Jonathan Leffler

7
在这种情况下,无论encodedEnd是否受限制都不会有影响;您已经向编译器承诺没有人别名unencodedencoded,因此读取和写入不会互相干扰。
在这种情况下,restrict很重要的真正原因是如果没有它,编译器无法知道通过encoded的写入不会影响通过unencoded的读取。例如,如果
encoded == unencoded+1

那么每次对 encoded 的写入都会影响到后续从 unencoded 的读取,因此编译器无法在写入完成之前进行加载调度。使用 restrict 关键字可以向编译器承诺这两个指针不会影响相同的内存,因此它可以提前进行加载调度以避免流水线停顿。


4

我认为你说得对,这不会有任何问题。在循环结束时,您的循环指针(称其为p)将等于encodedEnd。但是从循环后面(无论是从p还是encodedEnd)没有任何需要访问的内容,因此这不应该是一个问题。我认为这也不会有帮助,因为从encodedEnd中没有任何写入或读取的内容,因此没有什么可以被优化。

但我同意您的前两个限制应该真正有所帮助。


请注意,解引用 encodedEnd 是未定义行为,因为 encoded 也是 restrict - 因此,无论 encodedEnd 是否是 restrict 都没有任何影响。 - bdonlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接