Почему этот код считается VLA, даже если он использует int? - PullRequest
0 голосов
/ 27 мая 2020

Я думал, что понимаю, что такое VLA, пока не увидел заданный здесь вопрос о разнице между динамическим c распределением памяти и массивами переменной длины. Так что у меня нет проблем, по крайней мере, на данный момент, с динамическим c распределением памяти, но я не понимаю, почему этот код считается VLA:

int size = 10; // or whatever
int my_array [size] ; // why this is a VLA

Более загадочный Дело в том, что это даже должен быть VLA

const int size = 10;
int my_array [size];  // why even when i use a const it is a VLA .

Итак, мой вопрос, как эти два разных метода считаются VLA?

Насколько я знаю, VLA - это просто массив, размер которого известен только во время выполнения, например, если я предлагаю пользователю ввести размер массива и установить массив на этот размер, чтобы компилятор никогда не узнал размер массива .

Но в обоих фрагментах кода выше size уже известен во время компиляции, поэтому, если это правда, что это VLA, стандартный синтаксис массива должен быть таким и ничего больше.

int my_array[10];

Другой вопрос: я слышал, что const int size =10; на самом деле не является константой, что означает, что компилятор не знает, равен ли этот размер 10, он рассматривает его как переменную.

Итак, если кто может прояснить ситуацию, ты p немного о разнице между переменной и константой в C ++, это было бы очень полезно.

ПРИМЕЧАНИЕ: это ссылка на вопрос StackOverflow. Итак, если в этом вопросе что-то не так, кто-то может исправить это.

В чем разница между VLA и динамическим c выделение памяти через mallo c?

1 Ответ

2 голосов
/ 27 мая 2020

Во-первых, массивов переменной длины в C ++ не существует. В C ++ нет массивов переменной длины. Этот ответ относится только к определенному c расширению компилятора GNU для поддержки массивов переменной длины в C ++.

, почему это даже размер VLA, все еще известен компилятору

Вопрос не в том "что известно компилятору", вопрос в определениях. Определены термины и язык, а также определено, что такое VLA, а что нет. Массив переменной длины определяется как массив, размер которого не является целочисленным константным выражением - int vla[<not integer constant expresion>];. From C99 6.7.5.2p4 :

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

Что является, а что нет целочисленное постоянное выражение , в свою очередь, снова имеет очень определенное определение.

В C, с обоими определениями int size = 10; и const int size = 10; выражение size не является целочисленным постоянным выражением . Таким образом, оба определения массива, которые вы показали, являются массивами переменной длины. Конец.

В C ++ нет целочисленного константного выражения и, скорее всего (я предполагаю!) Компилятор GNU, работающий на C ++ с включенным расширением VLA, проверяет, соответствует ли выражение размера внутри объявления массива можно использовать в постоянном выражении . В C ++ интегральный тип с квалификацией const можно использовать в константном выражении, поэтому const int size = 10; int my_array [size]; - это обычный массив. Целочисленный тип, который не квалифицируется как const, не может использоваться в константном выражении, поэтому int size = 10; int my_array [size]; недопустим в C ++, а в компиляторе GNU с включенными расширениями получается массив переменной длины.

Почему этот код считается VLA, даже если он использует int?

«Использование int» не обязательно делает выражение константным выражением, которое необходимо для выражения внутри скобок внутри определения массива это не массив переменной длины.

как эти 2 разных метода считаются VLA?

Что касается C, выражение в скобках внутри массива определение должно быть постоянным выражением, потому что это не так, эти два фрагмента кода приводят к объявлению VLA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...