[Asterisk-Dev] [RFC] strncpy -> ast_copy_string
Kevin P. Fleming
kpfleming at digium.com
Sun May 1 18:31:29 MST 2005
The recent UTF-8 discussion brought to light something that I had not
realized before... strncpy() zero-fills the destination buffer, which is
waste of time (and cache pollution). In Asterisk, we are nearly always
copying strings into buffers that are much larger than required, so this
extra zero-writing is just wasted CPU cycles.
I've committed an ast_copy_string() function that works the same way as
strncpy() except for three differences:
- there is no return value (of the nearly 1,300 uses of strncpy in CVS
HEAD, only two use the return value)
- it guarantees that the output buffer will be null-terminated
- it does not null-pad the output buffer
I tested a simple search/replace conversion of chan_sip with no ill
effects, and the resulting .so file was slightly (a few hundred bytes)
smaller. No modules in Asterisk have actually been converted yet, though.
I do understand that GCC has a highly-optimized strncpy implementation
for each architecture it runs on, and I don't doubt that an open-coded
version will not be optimized as well. However, we'd be trading a
slightly slower implementation against not writing many, many billions
of excess zero bytes over the lifetime of an Asterisk instance.
Thoughts?
More information about the asterisk-dev
mailing list