Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > comp.lang.c++ > #82178
| From | Bo Persson <bo@bo-persson.se> |
|---|---|
| Newsgroups | comp.lang.c++ |
| Subject | Re: Global const objects missing from object file |
| Date | 2021-10-29 15:55 +0200 |
| Message-ID | <iu2cqjF75nU1@mid.individual.net> (permalink) |
| References | <sjqap1$sih$1@gioia.aioe.org> <sjrhdp$bta$1@dont-email.me> <sju2pd$1ko$1@gioia.aioe.org> <sjuau5$h17$1@dont-email.me> <861r44ez7k.fsf@linuxsc.com> |
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.
Now what?
Back to comp.lang.c++ | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll 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