Могу ли я использовать массив переменной переменной C в С++ 03 и С++ 11?

C имеет действительно классную функцию, называемую массивами переменной длины. Его доступно на C90 и выше, и это позволяет отложить размер массива до времени выполнения. См. Руководство GCC 6.19 Массивы переменной длины.

Я работаю на С++. В std=c++11 я получаю сбой компиляции из-за использования alloca под Cygwin. Я хочу, если возможно, переключиться на массивы переменной длины. Я также хочу попытаться избежать std::vector и std::array, потому что я хочу остаться в диспетчере памяти. Я считаю, что каждый бит помогает, поэтому я рад воспользоваться этими возможностями (что некоторые люди рассматривают глазок).

Можно ли использовать массив переменной длины в С++ 03 и С++ 11?

Ответ 1

VLA не входят в стандартный С++ 03 или С++ 11, поэтому вам лучше избегать их, если вы хотите написать строго стандартный код соответствия (и используйте, например, std::vector, которые обычно используют кучу для своих данных, но вы можете использовать свой собственный распределитель...).

Однако несколько компиляторов С++ (последние GCC и Clang) принимают VLA как расширение.

То же самое для гибких элементов массива; они не являются стандартными в С++ (только в C), но некоторые компиляторы принимают их.

dynarray -s не попал в стандарт С++ 11...

Ответ 2

Нет, если вы хотите, чтобы код был стандартным С++.

Нет стандарта С++ поддерживает VLA, но некоторые компиляторы С++ делают это как расширение для поставщика.

Вы можете добиться аналогичного эффекта на С++, используя стандартный vector. Обратите внимание, что в отличие от VLA, размер которых может быть только при создании, стандартный vector может быть изменен по мере необходимости (при условии выполнения соответствующих операций над ним).