Почему C++ позволяет массивы переменной длины, которые динамично не выделяются?

Я относительно плохо знаком с C++, и с начала его развернули в меня, что Вы не можете сделать чего-то как

int x;
cin >> x;
int array[x];

Вместо этого необходимо использовать динамическую память. Однако я недавно обнаружил, что вышеупомянутое скомпилирует (хотя я добираюсь - педантичное предупреждение, говоря, что оно запрещается ISO C++). Я знаю, что это - очевидно, плохая идея сделать это, если это не позволяется стандартом, но я ранее даже не знал, что это было возможно.

Мой вопрос, почему делает g ++, позволяют массивы переменной длины, которые динамично не выделяются, если он не позволяется стандартом? Кроме того, если для компилятора возможно сделать это, почему это не находится в стандарте?

7
задан Maulrus 9 April 2010 в 19:48
поделиться

4 ответа

В язык C в C99 добавлена ​​поддержка массивов переменной длины (VLA).

Вероятно, поскольку поддержка для них существует в gcc (для поддержки C99), было относительно просто добавить их поддержку в g ++.

Тем не менее, это расширение языка, зависящее от реализации, и не рекомендуется использовать расширения, зависящие от реализации, если вы хотите, чтобы ваш код был переносимым.

19
ответ дан 6 December 2019 в 06:23
поделиться

Потому что он поддерживается в C99. Я не могу сказать, почему этого нет в стандарте C ++. Однако он не так полезен, как вы думаете, потому что он легко приводит (если вы не будете осторожны) к переполнению стека (поскольку он обычно основан на alloca , что само по себе нестандартно). Другая ошибка - вернуть указатель на динамический массив, который немедленно выйдет за пределы области видимости.

5
ответ дан 6 December 2019 в 06:23
поделиться

Многие компиляторы охватывают и расширяют стандарты. На это есть две основные причины:

  1. Подлые разработчики компиляторов, вероятно, думают, что усложнение перехода от их компилятора помогает увеличить долговечность.
  2. Доброжелательные составители компиляторов, вероятно, думают, что дать вам больше возможностей, когда они могут с небольшими затратами или бесплатно для себя, - это хорошо.
3
ответ дан 6 December 2019 в 06:23
поделиться

Все упомянутые причины, связанные с тем, что они находятся в C, верны, хотя для требования есть ограничения. Ваш пример может продемонстрировать более гибкую поддержку, чем то, что требуется в C (если вы реализовали это с помощью scanf, а не cin, поместите его в файл .c и использовали gcc).

Это почти неявный вызов alloca (allocate auto), который просто уменьшает указатель стека (увеличивает размер стека) и копирует новый указатель стека в другой регистр, который используется как указатель на выделенную память.

Разница в том, что конструкторы и деструкторы не будут вызываться для объектов, созданных с помощью alloca.

1
ответ дан 6 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: