Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c++ > #120412

Re: thread about the pros and cons of lambdas, but more about cons

From Michael S <already5chosen@yahoo.com>
Newsgroups comp.lang.c++
Subject Re: thread about the pros and cons of lambdas, but more about cons
Date 2024-09-27 16:15 +0300
Organization A noiseless patient Spider
Message-ID <20240927161541.000036d8@yahoo.com> (permalink)
References <20240925195423.00007ecc@yahoo.com> <86ploq5dhm.fsf@linuxsc.com>

Show all headers | View raw


On Thu, 26 Sep 2024 14:09:09 -0700
Tim Rentsch <tr.17687@z991.linuxsc.com> wrote:

> Michael S <already5chosen@yahoo.com> writes:
> 
> [.. when or why to use lambdas? ..]
> 
> > Some time ago on comp.lang.c we had very long thread about
> > floodfill4 algorithm (that both myself and TimR took more
> > seriously than an issue deserves, but that's off topic).  
> 
> Thank goodness for that. :)
> 
> > Today I coded two implementations of original brute-force
> > recursive algorithm.
> >
> > // floodfill_recursive_nested.
> > // Implementation is in none-tricky C++
> > // Very similar to what can be done in C
> >
> > #include <cstddef>
> >
> > int floodfill4(
> >   unsigned char *grey,
> >   int width, int height,
> >   int x, int y,
> >   unsigned char target, unsigned char dest)
> > {
> >   if (width < 1 || height < 1)
> >     return 0;
> >   if (x < 0 || x >= width || y < 0 || y >= height)
> >     return 0;
> >
> >   size_t w = width, h = height;
> >   if (grey[y*w+x] != target)
> >     return 0;
> >
> >   struct {
> >     unsigned char *grey;
> >     size_t width, height;
> >     unsigned char target, dest;
> >     void core(size_t x, size_t y) const
> >     {
> >       if (x < width && y < height) {
> >         auto idx = y*width+x;
> >         if (grey[idx] == target) {
> >           grey[idx] = dest;
> >           core(x - 1, y);
> >           core(x + 1, y);
> >           core(x, y - 1);
> >           core(x, y + 1);
> >         }
> >       }
> >     }
> >   } context = {
> >     .grey = grey,
> >     .width = w, .height = h,
> >     .target = target, .dest = dest,
> >   };
> >   context.core(x, y);
> >   return 1;
> > }
> >
> > // end of floodfill_recursive_nested.
> >
> >
> >
> > // floodfill_recursive_lambda.
> > // Implementation in tricky C++
> > // C can not do it
> >
> > #include <cstddef>
> >
> > int floodfill4(
> >   unsigned char *grey,
> >   int width, int height,
> >   int x, int y,
> >   unsigned char target, unsigned char dest)
> > {
> >   if (width < 1 || height < 1)
> >     return 0;
> >   if (x < 0 || x >= width || y < 0 || y >= height)
> >     return 0;
> >
> >   size_t w = width, h = height;
> >   if (grey[y*w+x] != target)
> >     return 0;
> >
> >   auto core = [=] (auto& a_ref, size_t x, size_t y) {
> >     if (x >= w || y >= h)
> >       return;
> >     auto idx = y*w+x;
> >     if (grey[idx] == target) {
> >       grey[idx] = dest;
> >       a_ref(a_ref, x - 1, y);
> >       a_ref(a_ref, x + 1, y);
> >       a_ref(a_ref, x, y - 1);
> >       a_ref(a_ref, x, y + 1);
> >     }
> >   };
> >   core(core, x, y);
> >   return 1;
> > }
> >
> > // end of floodfill_recursive_lambda.
> >
> >
> > In the second variant in order to make it compile at all I had to
> > uses very dirty trick with lambda passed as parameter to itself.
> > I copied it from Stack Overflow, but don't pretend to understand
> > why it works and why it needed in the first place.
> >
> > But that's only part of the story.
> > The other part is that the first variant is 1.2x faster.  
> 
> The examples show two different ways of achieving the same goal.
> However these two ways aren't that much different from each
> other.  To me it seems like they are both making the same
> mistake, which is using a language feature to hide some context
> that is better left unhidden.  Here is a sketch to make that
> comment more concrete:
> 
>   int floodfill4(
>     unsigned char *grey,
>     int width, int height,
>     int x, int y,
>     unsigned char target, unsigned char dest)
>   {
>     /* possible early return */
> 
>     typedef struct {
>       unsigned char *grey;
>       // ... etc
>     } Stuff;
> 
>     Stuff stuff = { grey, width, height, /*...*/ };
> 
>     void
>     core( Stuff *it, size_t x, size_t y ){ 
>       auto k = y*it->width + x;
>       /* possible early return */
>       it->grey[k] = it->dest;
>       core( it, x-1, y   );
>       core( it, x+1, y   );
>       core( it, x,   y-1 );
>       core( it, x,   y+1 );
>     }
> 
>     core( &stuff, x, y )
>     return 1;
>   }
> 
> The code for core() looks basically the same except that in a few
> places we need to say it->width instead of width, etc.  There is
> no particular meaning to the contents of the struct;  all that's
> been done is to disguise where the variables are coming from.  I
> don't see any compelling reason to do that in this situation.
> 

Well, the code above is neither legal standard C++ nor legal standard C.
But I understand what you mean and how to make it legal by extracting
core() out of floodfill4() body. More so, that's where I started.
In theory, it's should be exactly the same as variant with core() as
member function. In practice, compiler (gcc) optimizes recursion of
member function much better.

> Getting back to lambdas, I would say that there are two primary
> uses for lambdas.  One use is as a convenience function, local to
> an outer function definition, where some small-scale processing
> step is encapsulated rather than being replicated.  The second use
> is as a call-back function given as an argument to some outside
> function, where there is state that the outside function doesn't
> know about.  The same kind of reasoning applies to member functions
> in structs defined locally in the outer function.  Neither of those
> scenarios applies in the earlier example functions.
> 

I don't disagree in theory. Practice is something else.

> In situations where an interface needs a callback function, usually
> specifying a lambda parameter means less work for the client of
> the interface, and so that scenario would be a good one to explore.

Back to comp.lang.c++ | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-25 19:54 +0300
  Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-25 19:17 +0200
  Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-25 19:55 +0200
  Re: thread about the pros and cons of lambdas, but more about cons Paavo Helde <eesnimi@osa.pri.ee> - 2024-09-25 22:53 +0300
    Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-25 23:30 +0300
      Re: thread about the pros and cons of lambdas, but more about cons Paavo Helde <eesnimi@osa.pri.ee> - 2024-09-26 00:04 +0300
        Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 11:17 +0300
        Re: thread about the pros and cons of lambdas, but more about cons Paavo Helde <eesnimi@osa.pri.ee> - 2024-09-26 11:25 +0300
          Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 10:28 +0200
            Re: thread about the pros and cons of lambdas, but more about cons Paavo Helde <eesnimi@osa.pri.ee> - 2024-09-26 11:49 +0300
          Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 11:38 +0300
  Re: thread about the pros and cons of lambdas, but more about cons Ben Bacarisse <ben@bsb.me.uk> - 2024-09-25 23:13 +0100
    Re: thread about the pros and cons of lambdas, but more about cons Ben Bacarisse <ben@bsb.me.uk> - 2024-09-25 23:28 +0100
      Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 10:41 +0300
        Re: thread about the pros and cons of lambdas, but more about cons David Brown <david.brown@hesbynett.no> - 2024-09-26 10:29 +0200
          Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 11:35 +0200
            Re: thread about the pros and cons of lambdas, but more about cons David Brown <david.brown@hesbynett.no> - 2024-09-26 13:27 +0200
              Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 13:31 +0200
                Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 15:25 +0300
                Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 14:58 +0200
                Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 16:53 +0300
                Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 15:54 +0200
        Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-27 16:55 +0300
      Re: thread about the pros and cons of lambdas, but more about cons Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-09-26 10:01 -0700
        Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 19:04 +0200
        Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 20:20 +0300
          Re: thread about the pros and cons of lambdas, but more about cons Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-09-26 10:38 -0700
            Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-27 16:27 +0300
              Re: thread about the pros and cons of lambdas, but more about cons Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-09-28 04:06 -0700
    Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-26 10:58 +0300
    Re: thread about the pros and cons of lambdas, but more about cons Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-09-26 10:27 -0700
      Re: thread about the pros and cons of lambdas, but more about cons Bonita Montero <Bonita.Montero@gmail.com> - 2024-09-26 19:32 +0200
  Re: thread about the pros and cons of lambdas, but more about cons Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-09-26 14:09 -0700
    Re: thread about the pros and cons of lambdas, but more about cons Michael S <already5chosen@yahoo.com> - 2024-09-27 16:15 +0300
      Re: thread about the pros and cons of lambdas, but more about cons Tim Rentsch <tr.17687@z991.linuxsc.com> - 2024-09-28 04:25 -0700

csiph-web