Em dom., 19 de abr. de 2020 às 22:00, David Rowley <dgrowle...@gmail.com>
escreveu:

> On Mon, 20 Apr 2020 at 11:24, Ranier Vilela <ranier...@gmail.com> wrote:
> > I tried: https://godbolt.org with:
> >
> > -O2:
> >
> > f1:
> > int main (int argv, char **argc)
> > {
> >     return strlen(argc[0]) == 0;
> > }
> >
> > f1: Assembly
> > main:                                   # @main
> >         mov     rcx, qword ptr [rsi]
> >         xor     eax, eax
> >         cmp     byte ptr [rcx], 0
> >         sete    al
> >         ret
> >
> > f2:
> > int main (int argv, char **argc)
> > {
> >     return argc[0] == '\0';
> > }
> >
> > f2: Assembly
> >
> > main:                                   # @main
> >         xor     eax, eax
> >         cmp     qword ptr [rsi], 0
> >         sete    al
> >         ret
> >
> > For me clearly str [0] == '\ 0', wins.
>
> I think you'd want to use argc[0][0] == '\0' or *argc[0] == '\0'.
> Otherwise you appear just to be checking if the first element in the
> argc pointer array is set to NULL, which is certainly not the same as
> an empty string.
>
I guess you're right.

x86-64 clang (trunk) -O2
f1:
int cmp(const char * name)
{
    return strlen(name) == 0;
}

cmp:                                    # @cmp
        xor     eax, eax
        cmp     byte ptr [rdi], 0
        sete    al
        ret

f2:
int cmp(const char * name)
{
    return name[0] == '\0';
}

cmp:                                    # @cmp
        xor     eax, eax
        cmp     byte ptr [rdi], 0
        sete    al
        ret

Is the same result in assembly.
Well, it doesn't matter to me, I will continue to use str[0] == '\0'.

Thanks for take part.

regards,
Ranier VIlela

Reply via email to