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


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

Re: Inline functions and locals

From Andrey Tarasevich <andreytarasevich@hotmail.com>
Newsgroups comp.lang.c++
Subject Re: Inline functions and locals
Date 2022-01-16 23:53 -0800
Organization A noiseless patient Spider
Message-ID <ss379q$j2d$1@dont-email.me> (permalink)
References <srmvu4$oie$1@gioia.aioe.org> <srqkvk$3vi$1@dont-email.me> <srrmd6$1bo0$1@gioia.aioe.org> <srs97q$qov$1@dont-email.me> <ss2vdc$eo5$1@gioia.aioe.org>

Show all headers | View raw


On 1/16/2022 9:38 PM, Juha Nieminen wrote:
> Andrey Tarasevich <andreytarasevich@hotmail.com> wrote:
>> As a historical note, it is true that keyword `inline` was originally
>> introduced specifically to "suggest" inlining of function bodies at call
>> sites. But it quickly became clear that it is useless and unnecessary in
>> this role. As a consequence, its role was refocused to being a "ODR
>> defeater" - a completely different purpose.
> 
> And as a side note, the C standard also added support for 'inline'
> functions, except that it's a different and very weird version of it that
> to this day I still don't fully understand. It's like an 'inline' that's
> *not* an "ODR defeater". (It's so confusing that the vast, vast majority
> of C programmers just write "static inline" to get around the confusing
> part.)

Yes, you are right. `inline` is clearly an "ODR defeater" in C++, but in 
C... not so much.

Firstly, `static inline` is a separate story. Most of the time `static` 
is all that's needed. In a quality compiler `static inline` is always 
redundant. It is 100% equivalent to plain `static`. There's never any 
tangible reason to use `static` and `inline` together. (Unless one wants 
to add `inline` for purely aesthetic reasons - to express how they feel 
about that function.)

The only thing that compiler needs to be able to inline a function call 
is access to the function's definition, to the full function's body. 
Once it can see the body, it can analyze and inline the calls (if it 
decides to inline). `static` functions are always defined inside their 
TUs, which means that they are already as inlinable as they can ever be. 
Declaring them `inline` on top of `static` achieves absolutely nothing.

So, the only tangible use of `inline` is with external linkage 
functions. External linkage implies that if an inline function ends up 
with a regular body, it should be one unique body in the whole program. 
And, thanks to that, the function will have unique address identity: 
same address in all TUs.

This is the objective. And this is where C and C++ take drastically 
different paths to that objective.

C++ achieves the above automatically through "generate them all; let 
linker sort them out" approach: compiler nonchalantly emits bodies for 
external linkage inline functions in different TUs, then linker discards 
all same-named bodies except one (see "weak symbols").

C, on the other hand, continues to stick to pedantically manual approach 
to ODR: it is the user's responsibility to ensure existence and 
uniqueness of a regular body generated for an inline function (just in 
case that body becomes necessary). The user chooses the TU for that body 
and the user triggers it by using the `extern inline` combination.

So, yes, in C `inline` is not really an "ODR defeater". `inline` 
definitions in C do not emit function bodies, which means that there's 
nothing to defeat. `extern inline` declaration does emit a function 
body, but the burden of making it (and making it only once) is placed 
upon the user.

-- 
Best regards,
Andrey Tarasevich

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


Thread

Inline functions and locals Muttley@dastardlyhq.com - 2022-01-12 16:34 +0000
  Re: Inline functions and locals Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-12 17:38 +0100
  Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-12 12:47 -0500
  Re: Inline functions and locals Juha Nieminen <nospam@thanks.invalid> - 2022-01-13 07:00 +0000
    Re: Inline functions and locals "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-01-13 10:45 +0100
      Re: Inline functions and locals Juha Nieminen <nospam@thanks.invalid> - 2022-01-17 12:55 +0000
        Re: Inline functions and locals David Brown <david.brown@hesbynett.no> - 2022-01-17 15:14 +0100
        Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-17 10:24 -0800
          Re: Inline functions and locals David Brown <david.brown@hesbynett.no> - 2022-01-17 19:46 +0100
    Re: Inline functions and locals Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-13 11:08 +0100
      Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-13 19:30 -0800
  Re: Inline functions and locals Paavo Helde <eesnimi@osa.pri.ee> - 2022-01-13 12:46 +0200
    Re: Inline functions and locals Muttley@dastardlyhq.com - 2022-01-13 15:38 +0000
  Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-13 17:51 -0800
    Re: Inline functions and locals Muttley@dastardlyhq.com - 2022-01-14 11:22 +0000
      Re: Inline functions and locals Öö Tiib <ootiib@hot.ee> - 2022-01-14 04:02 -0800
        Re: Inline functions and locals Manfred <invalid@invalid.add> - 2022-01-14 17:30 +0100
          Re: Inline functions and locals Muttley@dastardlyhq.com - 2022-01-14 16:49 +0000
        Re: Inline functions and locals Muttley@dastardlyhq.com - 2022-01-14 16:40 +0000
          Re: Inline functions and locals Öö Tiib <ootiib@hot.ee> - 2022-01-14 11:28 -0800
          Re: Inline functions and locals "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2022-01-14 20:29 +0100
      Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-14 08:34 -0500
        Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-14 11:26 -0500
          Re: Inline functions and locals David Brown <david.brown@hesbynett.no> - 2022-01-14 18:47 +0100
      Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-14 08:43 -0800
        Re: Inline functions and locals Juha Nieminen <nospam@thanks.invalid> - 2022-01-17 05:38 +0000
          Re: Inline functions and locals David Brown <david.brown@hesbynett.no> - 2022-01-17 08:12 +0100
            Re: Inline functions and locals "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-01-16 23:51 -0800
              Re: Inline functions and locals "Chris M. Thomasson" <chris.m.thomasson.1@gmail.com> - 2022-01-16 23:55 -0800
              Re: Inline functions and locals David Brown <david.brown@hesbynett.no> - 2022-01-17 11:35 +0100
            Re: Inline functions and locals Juha Nieminen <nospam@thanks.invalid> - 2022-01-17 09:50 +0000
              Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-17 14:39 -0500
                Re: Inline functions and locals Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-17 15:34 -0800
                Re: Inline functions and locals "james...@alumni.caltech.edu" <jameskuyper@alumni.caltech.edu> - 2022-01-17 15:50 -0800
                Re: Inline functions and locals Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-04-25 03:42 -0700
                Re: Inline functions and locals "james...@alumni.caltech.edu" <jameskuyper@alumni.caltech.edu> - 2022-04-25 08:48 -0700
          Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-16 23:53 -0800
            Re: Inline functions and locals Tim Rentsch <tr.17687@z991.linuxsc.com> - 2022-01-17 15:29 -0800
    Re: Inline functions and locals Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-17 12:40 +0100
      Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-17 10:13 -0800
        Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-17 16:15 -0500
          Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-17 16:28 -0800
            Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-17 22:55 -0500
              Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-18 11:32 -0800
                Re: Inline functions and locals James Kuyper <jameskuyper@alumni.caltech.edu> - 2022-01-18 19:03 -0500
                Re: Inline functions and locals Andrey Tarasevich <andreytarasevich@hotmail.com> - 2022-01-18 17:22 -0800
        Re: Inline functions and locals Bonita Montero <Bonita.Montero@gmail.com> - 2022-01-18 09:20 +0100

csiph-web