Posted May 29, 2012 9:44 UTC (Tue) by gb (subscriber, #58328)
[Link]
> You forgot to make the array const.
It makes no difference, code generated for:
const char* const a[]={"One", "Two", "Three"};
and
const char* a[]={"One", "Two", "Three"};
is same.
> static version has no const declaration at all.
Sure, i just missed it, it would not compile without it, should be:
static const char* a[]={"One", "Two", "Three"};
GCC Explorer - an interactive take on compilation
Posted May 30, 2012 5:18 UTC (Wed) by jzbiciak (✭ supporter ✭, #5246)
[Link]
Out of curiosity, in your "cosnt char *" version, are the strings "One", "Two" and "Three" allocated on the stack, or only the array a[]?
GCC Explorer - an interactive take on compilation
Posted May 30, 2012 7:51 UTC (Wed) by jamesh (guest, #1159)
[Link]
The array contains pointers in all cases, so the actual strings would be in the read-only data section with any combination of "const".
GCC Explorer - an interactive take on compilation
Posted May 30, 2012 8:18 UTC (Wed) by jzbiciak (✭ supporter ✭, #5246)
[Link]
Yep, it does seem to put it in rodata. I've seen enough shenanigans with initialized local arrays that I was prepared to hear it was strcpy()ing everything to local copies on the stack due to some obscure paragraph I missed in the standard. Thankfully, it's not that insane.
GCC Explorer - an interactive take on compilation
Posted May 30, 2012 11:28 UTC (Wed) by jamesh (guest, #1159)
[Link]
That kind of thing only really happens when using a static initialiser for a character array. Since this was an array of pointers, that doesn't apply.
This is all part of the C standard, so I doubt you'd see much variation in any compiler made in the last 15 years (probably more).
GCC Explorer - an interactive take on compilation
Posted May 30, 2012 14:03 UTC (Wed) by jzbiciak (✭ supporter ✭, #5246)
[Link]
Of course, GCC Explorer is showing us a C++ compiler, not a C compiler. There are many here who will point out that C++ isn't C or even a superset of C. ;-)
GCC Explorer - an interactive take on compilation
Posted May 30, 2012 15:32 UTC (Wed) by jamesh (guest, #1159)
[Link]
Right, but you can mostly think of it as a superset of C for things that C compilers agreed on 15+ years ago. And this particular piece of code was just using basic types and syntax common to both languages, so you would expect it to behave similarly.