在阅读strcpy
的手册页时,我发现函数stpcpy
也存在。但是,我在手册页中注意到的唯一区别是:
char *
stpcpy(char *s1, const char *s2);
char *
strcpy(char *restrict s1, const char *restrict s2);
那么,restrict
在这里是什么意思呢?
发布于 2011-04-29 09:06:18
restrict
告诉编译器s1
和s2
指向不同的数组,并且指向的数组中没有重叠。在某些情况下,这可能允许编译器执行额外的优化(即,它可能复制多个字符的块,而不必检查重叠)。
还要注意,返回值是不同的:stpcpy
返回一个指向复制到目标缓冲区中的\0
的指针,而strcpy
返回一个指向字符串开头的指针(它实际上执行了一个return s1;
)。
发布于 2011-04-29 09:26:13
你在标题中问的问题和关于restrict
的问题实际上是两个完全不相关的问题。其他答案已经为您提供了一些很好的链接,可以帮助您了解有关restrict
的更多信息。
然而,这两个函数之间的主要区别并不是restrict
说明符。事实上,在C99版本的C语言规范中,strcpy
的参数也有restrict
限定。您在strcpy
手册页上看到的内容根本没有更新以符合C99。
主要的区别(您似乎错过了)是stpcpy
的返回值。stpcpy
返回指向目标字符串的终止\0
字符的指针。这立即说明了stpcpy
的用途及其存在背后的基本原理:当您需要将多个子字符串连接成一个字符串时,此函数旨在用作strcat
函数的智能替代。您知道,strcat
在这样的应用程序中工作得很差(我甚至想说strcat
在实际代码中没有什么有意义的用途)。strcat
的问题是,每次您向其添加内容时,它都会重新扫描目标字符串,因此会做很多不必要的工作,并且基本上会生成比光更多的热。例如,下面的代码就遇到了这个问题
const char *part1, *part2, *part3, *part4;
...
char buffer[size]; /* assume that `size` is calculated properly */
strcpy(buffer, part1);
strcat(buffer, part2);
strcat(buffer, part3);
strcat(buffer, part4);
通过使用stpcpy
,可以以更合理的方式重新实现此代码
stpcpy(stpcpy(stpcpy(stpcpy(buffer, part1), part2), part3), part4);
如果您不喜欢链式调用,可以使用中间指针来存储中间stpcpy
调用的返回值
char *end = buffer;
end = stpcpy(end, part1);
end = stpcpy(end, part2);
end = stpcpy(end, part3);
end = stpcpy(end, part4);
当然,值得一提的是,strcpy
和strcat
是标准函数,而stpcpy
不是。
发布于 2011-04-29 09:04:33
简而言之,restrict
告诉编译器s1和s2指向的内存段不重叠;这允许代码执行较少的错误检查。
https://stackoverflow.com/questions/5826773
复制相似问题