perl - What's the difference between sv_catpv() and sv_catpvs()? -



perl - What's the difference between sv_catpv() and sv_catpvs()? -

according perlapi, sv_catpv() works follows:

concatenates nul-terminated string onto end of string in sv. if sv has utf-8 status set, bytes appended should valid utf-8. handles 'get' magic, not 'set' magic.

void sv_catpv(sv *const sv, const char* ptr)

most of xs tutorials i've found utilize sv_catpvs(), though, this:

like sv_catpvn, takes literal string instead of string/length pair.

void sv_catpvs(sv* sv, const char* s)

well, that's not helpful, let's @ sv_catpvn():

concatenates string onto end of string in sv. len indicates number of bytes copy. if sv has utf-8 status set, bytes appended should valid utf-8. handles 'get' magic, not 'set' magic.

void sv_catpvn(sv *dsv, const char *sstr, strlen len)

so, sv_catpvn same thing sv_catpv except takes string length separate parameter, , sv_catpvs same sv_catpvn except takes literal string.

is there subtle difference between sv_catpv , sv_catpvs i'm missing, or 2 ways same thing?

as per passages quoted, sv_catpvs takes string literal.

const char *str = "foo"; sv_catpvs(sv, "foo"); // ok sv_catpvs(sv, str); // error

sv_catpv, on other hand, accepts look returns string.

sv_catpv(sv, "foo"); // ok sv_catpv(sv, str); // ok

so why sv_catpvs exist @ all? because it's faster. reason sv_catpvs takes takes string literal it's macro expands

sv_catpvs(sv, "foo")

into similar to

sv_catpvn_flags(sv, "foo", sizeof("foo")-1, sv_gmagic)

which resolves to

sv_catpvn_flags(sv, "foo", 3, sv_gmagic)

at compile-time. sv_catpv, on other hand, forced utilize slower strlen.

perl xs

Comments

Popular posts from this blog

Delphi change the assembly code of a running process -

json - Hibernate and Jackson (java.lang.IllegalStateException: Cannot call sendError() after the response has been committed) -

C++ 11 "class" keyword -