Posted May 28, 2012 16:25 UTC (Mon) by gb (subscriber, #58328)
[Link]
> why? you _told_ the compiler you wanted a const array in the stack in foo1 and you wanted it in the "static area" (.data?) in foo2...
I think it is not expected to work in this way, for example, if you have a:
int f() {
int a=10;
return a;
}
The compiler would happily ignore that 'i told him to create variable a on stack' in favor of making code more optimal.
In same way, in case of
const char a[]={X1,X2,X3};
compiler knows that "a" is completely unused anywhere except inside this function, and I expect what it would optimize the code as much as possible. Maximum optimization here seems like creating whole array in static area and pushing each value to stack each time i am calling this function.
GCC Explorer - an interactive take on compilation
Posted May 28, 2012 16:28 UTC (Mon) by gb (subscriber, #58328)
[Link]
err, typo s/and pushing each value to stack each time i am calling this function/instead of pushing each value to stack each time i am calling this function/
GCC Explorer - an interactive take on compilation
Posted May 28, 2012 16:51 UTC (Mon) by hummassa (subscriber, #307)
[Link]
You seem to have forgotten something important: the compiler does not know if you want to retain the state from one call to the function to the next, and that would be an important side effect of static... and the reason why static (and static const) puts stuff on .data, as opposed to automatic (and automatic const) pushing values on the stack.
GCC Explorer - an interactive take on compilation
Posted May 28, 2012 21:09 UTC (Mon) by gb (subscriber, #58328)
[Link]
Nope, i haven't forgotten this.
Compiler do know this perfectly, this static array is entirely inside function scope and it's trivial for compiler to find that static const case is absolutely same to plain const case, and that both are never used outside of scope of this function.
GCC Explorer - an interactive take on compilation
Posted May 29, 2012 18:53 UTC (Tue) by hummassa (subscriber, #307)
[Link]
Anyway, arrays have to deal with many issues (aliasing, for instance) that preclude many optimization strategies; sometimes, the compiler programmers have to give some priority for the strategies that don't have to deal with that.
GCC Explorer - an interactive take on compilation
Posted May 29, 2012 9:41 UTC (Tue) by dgm (subscriber, #49227)
[Link]
In C "const" does no imply any specific kind of storage. You can have register consts, static consts, auto consts, extern consts, and consts in the heap.
This is one of those places where C shows it's really a medium-level language, that gives you far more control over such little details than anything else.