То, почему переменная длина не, выстраивает часть стандарта C++?

$ dpkg -s libgtk2.0-0|grep '^Version'
308
задан Community 23 May 2017 в 02:18
поделиться

7 ответов

Недавно в usenet началось обсуждение этого вопроса: Почему нет VLA в C ++ 0x .

Я согласен с теми людьми, которые, кажется, согласны с тем, что создание потенциально большого массива в стеке, в котором обычно мало свободного места, нехорошо. Аргумент в том, что если вы заранее знаете размер, вы можете использовать статический массив. А если заранее не знать размер, напишете небезопасный код.

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

Вы можете использовать std :: vector , но это не совсем то же самое, поскольку он использует динамическую память, и заставить его использовать собственный стек-распределитель не совсем просто (выравнивание также является проблемой). Это также не решает ту же проблему, потому что вектор является контейнером изменяемого размера, тогда как VLA имеют фиксированный размер. Предложение C ++ Dynamic Array предназначено для внедрения решения на основе библиотеки в качестве альтернативы VLA на основе языка. Однако, насколько мне известно, он не будет частью C ++ 0x.

поскольку он использует динамическую память, и заставить его использовать собственный распределитель стека не совсем просто (выравнивание также является проблемой). Это также не решает ту же проблему, потому что вектор - это контейнер с изменяемым размером, тогда как VLA имеют фиксированный размер. Предложение C ++ Dynamic Array предназначено для внедрения решения на основе библиотеки в качестве альтернативы VLA на основе языка. Однако, насколько мне известно, он не будет частью C ++ 0x.

поскольку он использует динамическую память, и заставить его использовать собственный распределитель стека не совсем просто (выравнивание также является проблемой). Это также не решает ту же проблему, потому что вектор - это контейнер с изменяемым размером, тогда как VLA имеют фиксированный размер. Предложение C ++ Dynamic Array предназначено для внедрения решения на основе библиотеки в качестве альтернативы VLA на основе языка. Однако, насколько мне известно, он не будет частью C ++ 0x.

191
ответ дан 23 November 2019 в 01:17
поделиться

Вам нужно постоянное выражение для объявления массива в C / C ++.

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

void foo(int n) {
    int* values = new int[n]; //Declare a variable length array
    [...]
    delete [] values;
}
-10
ответ дан 4 October 2019 в 02:05
поделиться

Если вы знаете значение во время компиляции, вы можете сделать следующее:

template <int X>
void foo(void)
{
   int values[X];

}

Изменить: вы можете создать вектор, который использует распределитель стека (alloca), поскольку распределитель является шаблоном параметр.

-1
ответ дан 23 November 2019 в 01:17
поделиться

Подобные массивы являются частью C99, но не являются частью стандартного C ++. как говорили другие, вектор всегда является гораздо лучшим решением, поэтому, вероятно, поэтому массивы переменного размера не входят в стандарт C ++ (или в предлагаемый стандарт C ++ 0x).

Кстати, для вопросов «почему» стандарт C ++ таков, как он есть, модерируемая группа новостей Usenet comp.std.c ++ - это то место, куда можно обратиться.

0
ответ дан 23 November 2019 в 01:17
поделиться

Используйте для этого std :: vector. Например:

std::vector<int> values;
values.resize(n);

Память будет выделена в куче, но это имеет лишь небольшой недостаток производительности. Кроме того, разумно не размещать большие блоки данных в стеке, так как он довольно ограничен по размеру.

3
ответ дан 23 November 2019 в 01:17
поделиться

Вы всегда можете использовать alloca () для выделения памяти в стеке во время выполнения, если хотите:

void foo (int n)
{
    int *values = (int *)alloca(sizeof(int) * n);
}

Выделение в стеке подразумевает, что она будет автоматически освобождена, когда стек раскручивается.

Краткое примечание: Как упоминалось на странице руководства Mac OS X для alloca (3), «Функция alloca () зависит от машины и компилятора; ее использование не рекомендуется». Просто чтобы вы знали.

24
ответ дан 23 November 2019 в 01:17
поделиться

Это рассматривалось для включения в C ++ / 1x, , но было исключено (это поправка к тому, что я сказал ранее).

В любом случае это было бы менее полезно в C ++, поскольку мы уже иметь std :: vector для выполнения этой роли.

7
ответ дан 23 November 2019 в 01:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: