2 ms·
It's always been a "programmer aid annotation" rather than anything that really affects code generation. The only possible difference (from the resulting binar
by kimixa 3y ago
It's always been a "programmer aid annotation" rather than anything that really affects code generation.
The only possible difference (from the resulting binary POV) I can think of is "static const" variables might be allocated in a read-only executable section?
- throwway120385 3y agoProbably not, given the possibility that they can be const_casted back into mutable values. Locating static const values in read-only pages would result in crashes from valid statements in the language. In other words if you put a static const in a read only page, it would probably be considered a bug in your linker.
- actionfromafar 3y agoThat doesn't rhyme with my understanding of C++ (which is limited, of course). This sounds like undefined.
- secondcoming 3y agoAren't they put into the .rodata section of the binary? Crashing is exactly what happens, thankfully https://godbolt.org/z/vKj9dcPMc https://godbolt.org/z/vKj9dcPMc
- gary_0 3y agoGenerally yes, if you have a bunch of const data in your C++ code, it will go in .rodata. Depending on the compiler/flags/optimizations, of course. https://stackoverflow.com/a/44938843 https://stackoverflow.com/a/44938843
- PhilipRoman 3y agoIt doesn't even have to be static. Const is powerful when used on non-pointer types. You can write something like this and the compiler will (on appropriate optimization levels) hard-code return value to 7777 regardless of what "mutate" does: extern void mutate(int *p); int func() { const int foo = 7777; mutate(&foo); return foo; }
- gary_0 3y agoconst_cast is only for removing const from references or pointers that actually refer to a non-const object. You can't declare a const variable and then modify it with const_cast. See "Notes" at: https://en.cppreference.com/w/cpp/language/const_cast https://en.cppreference.com/w/cpp/language/const_cast The compiler can indeed put const objects in the executable's .rodata section, which means trying to modify it at runtime will probably cause a segfault (but it's all Undefined Behavior so who knows).