Reputation: 70030
g++
allows Variable Length Arrays (VLA) as an extension. The results of sizeof
operator on VLAs are interesting:
int main ()
{
char size = 20, a[10], b[size];
cout<<"sizeof(a) = "<<sizeof(a)<<endl; // sizeof(a) = 10, (can be used as template param)
cout<<"sizeof(b) = "<<sizeof(b)<<endl; // sizeof(b) = 20 !! (can't used be as template param)
}
In case of sizeof(b)
, is g++ not following the standard where sizeof
is evaluated only at compile time? Is sizeof
overloaded?
Upvotes: 2
Views: 401
Reputation: 254631
VLAs are an exception to the rule that the operand of sizeof
is not evaluated, as specified in C99, 6.5.3.4/2:
If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
This behaviour is a g++ extension; in Standard C++ (up to and including C++14) the operand of sizeof
is never evaluated (and VLAs are not permitted).
Upvotes: 4
Reputation: 20201
Variable Length Arrays are a part of C99, which is not in C++. Gcc allows them as an extension in C++ using the behaviour from C99, which does indeed say that sizeof
returns the actual size of the array (and is therefore evaluated at runtime). The wikipedia article about sizeof gives a nice summary of its behaviour.
Upvotes: 3
Reputation: 500683
VLAs were introduced in C99. In C99, sizeof(vla)
is not a compile-time constant, but takes into account the run-time size of the array.
gcc/g++
allow VLAs in non-C99 code, as an extension. When doing so, the compilers follow the C99 semantics. This is what you're observing.
Upvotes: 4