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


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

Re: Global const objects missing from object file

From Tim Rentsch <tr.17687@z991.linuxsc.com>
Newsgroups comp.lang.c++
Subject Re: Global const objects missing from object file
Date 2021-11-07 04:51 -0800
Organization A noiseless patient Spider
Message-ID <86mtmgb02h.fsf@linuxsc.com> (permalink)
References (1 earlier) <sjrhdp$bta$1@dont-email.me> <sju2pd$1ko$1@gioia.aioe.org> <sjuau5$h17$1@dont-email.me> <861r44ez7k.fsf@linuxsc.com> <iu2cqjF75nU1@mid.individual.net>

Show all headers | View raw


Bo Persson <bo@bo-persson.se> writes:

> On 2021-10-29 at 15:29, Tim Rentsch wrote:
>
>> Paavo Helde <myfirstname@osa.pri.ee> writes:
>>
>>> 10.10.2021 09:55 Steve Keller kirjutas:
>>>
>>>> Paavo Helde <myfirstname@osa.pri.ee> writes:
>>>>
>>>>> Such global const definitions normally appear in a common header file
>>>>> and would just cause duplicate linker symbols if they had external
>>>>> linkage.  Now they can be just optimized away in translation units
>>>>> which do not use them.
>>>>>
>>>>> I believe the original motivation was to have an easy replacement of C
>>>>> macros in header files, i.e. instead of
>>>>>
>>>>> #define a 42
>>>>>
>>>>> one can easily use
>>>>>
>>>>> const int a = 42;
>>>>>
>>>>> which would function almost exactly like a #define, plus it honors C++
>>>>> namespaces and cannot be undefined.
>>>>
>>>> If you write such "global" const objects into a header file they are
>>>> in fact not global, because the implicit 'static' makes them local to
>>>> file translation unit and this can even cause duplication:
>>>>
>>>>       $ cat foo.hh
>>>>       const int a = 42;
>>>>            const int *bar();
>>>>       $ cat x.cc
>>>>       #include "foo.hh"
>>>>            const int *bar() { return &a; }
>>>>       $ cat y.cc
>>>>       #include <iostream>
>>>>            #include "foo.hh"
>>>>            const int *foo() { return &a; }
>>>>            int main()
>>>>       {
>>>>           std::cout << (void *)foo() << '\n' << (void *)bar() << '\n';
>>>>       }
>>>>       $ g++ -Os -o foo x.cc y.cc
>>>>       $ ./foo
>>>>       0x56027d731008
>>>>       0x56027d731004
>>>>
>>>> For a small 'int' one may not care but for larger constant objects
>>>> this may be really bad.
>>>
>>> The unused const objects are routinely optimized away be the compiler,
>>> as you saw by yourself ("object file was empty").
>>>
>>> It's true that for larger and more complicated objects this might not
>>> work so well.  So don't do that.  Put the object in a single TU and
>>> provide functions to access it.  (Making the object extern is not safe
>>> in general because of the "Static Initialization Order Fiasco".)
>>>
>>>> To avoid it, I think you still have to write the defintion into only
>>>> one C++ source file using 'extern'
>>>>
>>>>       extern const int = 42;
>>>>
>>>> and put
>>>>
>>>>       extern const int a;
>>>>
>>>> into the header file.  I still don't see the advantage for C++ to
>>>> differ from C here.
>>>
>>> In some sense the do not differ.  The const globals in C++ are
>>> primarily meant for replacing C #define.  Each C #define is TU-specific
>>> and gets fully preprocessed by the preprocessor, no other TU-s are
>>> involved.
>>
>> It appears you have sidestepped the central question here.  What a
>> definition like 'const int foo = 7;'  (without any mention anywhere
>> of 'extern') does in C++ is, AFAICT, exactly the same as a similar
>> definition with static, namely 'static const int foo = 7;'.  If
>> these two definitions are exactly the same (and I believe they are),
>> why change the meaning of the version that doesn't say 'static'?
>> Why introduce what appears to be a gratuitous incompatibility with C
>> when there was already a perfectly good construct that could be used
>> (and works in C++ now) for defining a local constant?
>
> A problem here is that C++ introduced the const keyword first.
>
> When C got it later, the C committee decided to do it slighly
> differently.

These statements leave out some important parts of the story.

No question that const appeared first in early versions of C++.

Not long after that however const was assimilated into working C
compilers (and years before ANSI C was ratified).  So a basis for
comparison was evident pretty early.

The question here though is not about const but about changing
the C linkage model.  It was obvious from day one that using
const without a storage class to mean internal linkage is a
departure from the C linkage model.  And an unnecessary one:  to
the best of my knowledge 'static const <type> whatever;'  has
always worked in C++ the same as without the 'static'.  Allowing
a redundant form gives rise to a gratuitous incompatibility.

In the late 1980s not many people were using C++, and C++ was
itself in a state of flux.  It would have been easy at that time
to abandon the rule that const-without-static had internal
linkage, getting rid of the oddball linkage exception, and
restore compatibility with C rules (by then the ANSI C efforts
were far enough along that one could see what those rules would
be post-standardization).

I must admit it irks me more than a little bit that C++'s idea of
staying compatible with C is always for C to change to make C
more like C++, and never the other way around.

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


Thread

Global const objects missing from object file Steve Keller <keller.steve@gmx.de> - 2021-10-08 22:47 +0200
  Re: Global const objects missing from object file red floyd <no.spam.here@its.invalid> - 2021-10-08 15:09 -0700
    Re: Global const objects missing from object file Steve Keller <keller.steve@gmx.de> - 2021-10-10 08:28 +0200
      Re: Global const objects missing from object file Paavo Helde <myfirstname@osa.pri.ee> - 2021-10-10 12:03 +0300
      Re: Global const objects missing from object file David Brown <david.brown@hesbynett.no> - 2021-10-10 12:29 +0200
  Re: Global const objects missing from object file Paavo Helde <myfirstname@osa.pri.ee> - 2021-10-09 10:47 +0300
    Re: Global const objects missing from object file scott@slp53.sl.home (Scott Lurndal) - 2021-10-09 14:32 +0000
      Re: Global const objects missing from object file Paavo Helde <myfirstname@osa.pri.ee> - 2021-10-09 21:39 +0300
    Re: Global const objects missing from object file Steve Keller <keller.steve@gmx.de> - 2021-10-10 08:55 +0200
      Re: Global const objects missing from object file Bo Persson <bo@bo-persson.se> - 2021-10-10 10:34 +0200
        Re: Global const objects missing from object file Steve Keller <keller.steve@gmx.de> - 2021-10-10 15:55 +0200
          Re: Global const objects missing from object file Paavo Helde <myfirstname@osa.pri.ee> - 2021-10-10 17:28 +0300
            Re: Global const objects missing from object file Steve Keller <keller.steve@gmx.de> - 2021-10-10 20:42 +0200
              Re: Global const objects missing from object file Paavo Helde <myfirstname@osa.pri.ee> - 2021-10-10 22:44 +0300
      Re: Global const objects missing from object file Paavo Helde <myfirstname@osa.pri.ee> - 2021-10-10 12:14 +0300
        Re: Global const objects missing from object file Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-10-29 06:29 -0700
          Re: Global const objects missing from object file Bo Persson <bo@bo-persson.se> - 2021-10-29 15:55 +0200
            Re: Global const objects missing from object file Öö Tiib <ootiib@hot.ee> - 2021-10-29 22:20 -0700
            Re: Global const objects missing from object file Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-11-07 04:51 -0800
          Re: Global const objects missing from object file scott@slp53.sl.home (Scott Lurndal) - 2021-10-29 14:44 +0000
            Re: Global const objects missing from object file Tim Rentsch <tr.17687@z991.linuxsc.com> - 2021-11-07 05:08 -0800
              Re: Global const objects missing from object file scott@slp53.sl.home (Scott Lurndal) - 2021-11-07 14:21 +0000
      Re: Global const objects missing from object file David Brown <david.brown@hesbynett.no> - 2021-10-10 12:33 +0200
  Re: Global const objects missing from object file "Alf P. Steinbach" <alf.p.steinbach@gmail.com> - 2021-10-09 15:05 +0200
  Re: Global const objects missing from object file Juha Nieminen <nospam@thanks.invalid> - 2021-10-09 17:40 +0000

csiph-web