根据perlapisv_catpv()的工作方式如下:

我发现的大多数XS教程都使用sv_catpvs(),这样做是:

好吧,这不是很有帮助,所以让我们看一下sv_catpvn():

因此,sv_catpvnsv_catpv的作用相同,不同之处在于它以字符串长度作为单独的参数,并且sv_catpvssv_catpvn相同,不同之处在于它接受文字字符串。
我缺少的sv_catpvsv_catpvs之间有一些细微的区别,还是它们只是做同一件事的两种方式?

最佳答案

根据您引用的段落,sv_catpvs仅采用字符串文字。

const char *str = "foo";

sv_catpvs(sv, "foo");   // ok
sv_catpvs(sv, str);     // ERROR

另一方面,sv_catpv接受任何返回字符串的表达式。
sv_catpv(sv, "foo");    // ok
sv_catpv(sv, str);      // ok

那么,为什么sv_catpvs完全存在?因为它更快。 sv_catpvs仅采用字符串文字的原因是它是一个扩展的宏
sv_catpvs(sv, "foo")

变成类似
sv_catpvn_flags(sv, "foo", sizeof("foo")-1, SV_GMAGIC)

解析为
sv_catpvn_flags(sv, "foo", 3, SV_GMAGIC)

在编译时。另一方面,sv_catpv被迫使用较慢的strlen

关于perl - sv_catpv()和sv_catpvs()有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26637496/

10-10 05:14