avoid calling strlen() twice in readlink()

Christian Franke Christian.Franke@t-online.de
Thu Mar 8 18:48:00 GMT 2012


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



More information about the Cygwin-patches mailing list