2015-07-27 2 views
3

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

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

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

+0

Вы можете достигнуть VLA с помощью alloca – texasbruce

+0

. Было бы проблемой поставить некоторые ограничения на работоспособность вашей программы и использовать массив статического размера? – paddy

+0

Это не проверка границ, которая меня беспокоит. Его время от времени происходит в диспетчере памяти каждый раз, когда вызывается эта конкретная функция ..... Поскольку я не могу зависеть от динамических массивов (спасибо Basile), мне придется рассмотреть переход на 'std :: array', так как это C++ 11. – jww

ответ

7

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

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

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

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

+0

Спасибо Базиле. Я беспокоился об этом. Я рад, что спросил. И спасибо за ответ. – jww

+0

Я следил за вашей ссылкой на [гибкие элементы массива] (https://en.wikipedia.org/wiki/Flexible_array_member) и не понимаю, что особенного в них. Разве они не такие же, как 'struct {unsigned length; двойной * массив; }; ', то есть' double * array' вместо 'double array []'? – Walter

+0

@Walter: Нет, указатели не являются массивами. При распределении указателя на 'struct', который заканчивается членом гибкого массива, вы обычно выделяете дополнительное пространство для этого гибкого элемента массива. –

2

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

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

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

Смежные вопросы