Могу ли я использовать массив переменной переменной 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
может быть изменен по мере необходимости (при условии выполнения соответствующих операций над ним).