Оператор sizeof оценивается по-разному для VLA с помощью gcc? - PullRequest
2 голосов
/ 03 января 2012

g++ допускает Массивы переменной длины (VLA) в качестве расширения.Интересны результаты оператора sizeof в VLA:

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)
}

В случае sizeof(b) не нарушает ли g ++ стандарт, где sizeof оценивается только во время компиляции?sizeof перегружен ?

Ответы [ 3 ]

4 голосов
/ 03 января 2012

VLA были введены в C99. В C99 sizeof(vla) не является константой времени компиляции, но учитывает размер массива во время выполнения.

gcc/g++ разрешить VLA в коде, отличном от C99, в качестве расширения. При этом компиляторы следуют семантике C99. Это то, что вы наблюдаете.

4 голосов
/ 03 января 2012

VLA являются исключением из правила, согласно которому операнд sizeof не оценивается, как указано в C99, 6.5.3.4/2:

.

Если тип операнда является типом массива переменной длины, операнд вычисляется; в противном случае, операнд не оценивается, а результатом является целочисленная константа.

Это поведение является расширением g ++; в стандарте C ++ (до C ++ 14 включительно) операнд sizeof никогда не оценивается (и VLA не допускаются).

3 голосов
/ 03 января 2012

Массивы переменной длины являются частью C99, которого нет в C ++.Gcc разрешает их как расширение в C ++, используя поведение из C99, которое действительно говорит, что sizeof возвращает фактический размер массива (и, следовательно, оценивается во время выполнения). Статья в Википедии о sizeof дает хорошее резюме ее поведения.

...