This is the mail archive of the
cygwin-patches
mailing list for the Cygwin project.
Re: avoid calling strlen() twice in readlink()
Corinna Vinschen wrote:
On Mar 8 08:29, Eric Blake wrote:
On 03/08/2012 06:37 AM, VÃclav Zeman wrote:
Hi.
Here is a tiny patch to avoid calling strlen() twice in readlink().
- ssize_t len = min (buflen, strlen (pathbuf.get_win32 ()));
+ size_t pathbuf_len = strlen (pathbuf.get_win32 ());
+ size_t len = MIN (buflen, pathbuf_len);
memcpy (buf, pathbuf.get_win32 (), len);
For that matter, is calling pathbuf.get_win32() twice worth factoring out?
It's just a const char *pointer, and it's an inline method. I'm pretty
sure the compiler will optimize this just fine.
Yes - and it does ever more:
strlen() is one of the compiler builtins declared with a const attribute
internally. Then gcc optimizes duplicate calls away.
Testcase:
$ cat opt.cc
#include <string.h>
class X {
const char * p;
public:
X();
const char * get() { return p; }
};
int f(X & x)
{
int i = 0;
i += strlen(x.get());
i += strlen(x.get());
i += strlen(x.get());
i += strlen(x.get());
i += strlen(x.get());
return i;
}
int g(X & x)
{
return 5 * strlen(x.get());
}
$ gcc -S -O2 -fomit-frame-pointer opt.cc
$ cat opt.s | c++filt
...
f(X&):
subl $28, %esp
movl 32(%esp), %eax
movl (%eax), %eax
movl %eax, (%esp)
call _strlen
addl $28, %esp
leal (%eax,%eax,4), %eax
ret
...
g(X&):
subl $28, %esp
movl 32(%esp), %eax
movl (%eax), %eax
movl %eax, (%esp)
call _strlen
addl $28, %esp
leal (%eax,%eax,4), %eax
ret
(interesting: With -O1 it uses an inline version of strlen, with
-O2,3,... it doesn't)
So this patch probably had no effect at all, sorry :-)
Christian