我对此有一个大致的了解,restrict但我希望能澄清一些要点。我有一个函数,它从一个缓冲区读取一个以空字符结尾的字符串,并在另一个缓冲区中写出一个 URL 编码版本。该函数有这个签名(目前没有restrict):
char const *StringUrlEncode(char const *unencoded,
char *encoded,
char *encodedEnd);
unencoded是我的以 null 结尾的源字符串。目标缓冲区由encodedand表示encodedEnd,其中encoded指向缓冲区中的第一个字符char并encodedEnd指向缓冲区之后的第一个字符,即该函数将chars 写入但不包括指向的位置encodedEnd- 这是您的基本begin/end迭代器如果您熟悉 C++ STL 约定,请配对。
如果我添加restrict到这个函数,它应该只应用于前两个参数:
char const *StringUrlEncode(char const *restrict unencoded,
char *restrict encoded,
char *encodedEnd);
或者将它添加到所有三个参数中是否有一些我不理解的好处?
我可以看到制作输入和输出缓冲区restrict有助于编译器知道它们不重叠。但由于最后一个参数 ,encodedEnd仅用于标记输出缓冲区的结束,我认为这restrict对编译器没有任何帮助(尽管我认为它不会伤害,除了增加不必要的噪音到函数声明)。