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

В C есть действительно классная функция, называемая массивами переменной длины. Он доступен в C90 и выше и позволяет откладывать размер массива до времени выполнения. См. руководство GCC 6.19 Массивы переменной длины.

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

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


person jww    schedule 27.07.2015    source источник
comment
Вы можете достичь VLA, используя alloca   -  person texasbruce    schedule 27.07.2015
comment
Не будет ли проблемой наложить некоторые ограничения на вашу программу и использовать массив статического размера?   -  person paddy    schedule 27.07.2015
comment
Меня беспокоит не проверка границ. Он снова и снова входит в диспетчер памяти каждый раз, когда вызывается эта конкретная функция..... Поскольку я не могу зависеть от динамических массивов (спасибо Basile), мне придется подумать о переключении на std::array, поскольку это С++ 11.   -  person jww    schedule 27.07.2015


Ответы (2)


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

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

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

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

person Basile Starynkevitch    schedule 27.07.2015
comment
Спасибо Базиль. Я немного беспокоился об этом. Я рад, что спросил. И спасибо за ответ. - person jww; 27.07.2015
comment
Я перешел по вашей ссылке на элементы гибкого массива и не понимаю, что в них особенного. Разве они не такие же, как struct {unsigned length; double*array; };, то есть double*array вместо double array[]? - person Walter; 27.07.2015
comment
@Walter: Нет, указатели не являются массивами. При размещении указателя на struct, оканчивающегося элементом гибкого массива, обычно выделяется дополнительное пространство для этого члена гибкого массива. - person Basile Starynkevitch; 27.07.2015

Нет, если вам нужен стандартный код C++.

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

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

person Peter    schedule 27.07.2015