2
#include <iostream> 

    using namespace std; 

    int main(int argc, const char * argv[]) 
    { 

     int size; 
     cin >> size; 
     int myArray[size]; //this shouldn't compile , right ? 

     return 0; 
    } 

Я думал, что это не скомпилируется, но на самом деле (с помощью команды g ++).Как статический массив с переменным размером работает на C++?

Что я узнал позже, так это то, что GCC фактически позволяет массивы переменного размера, даже если стандартным C++ не поддерживает массивы переменного размера, что странно! Потому что я слышу, как все говорят, что единственный способ создать массив с переменным размером - использовать динамическое размещение, например, int* array = new int[size]; или лучше std::vector. Я думал, что GCC не позволит этот кусок кода!

Во всяком случае, мой теоретического вопрос, то myArray массива выделяется в куче или стека области ?

+1

Вы слишком поздно: http://stackoverflow.com/questions/12484588/differences-with-ide-compilers-array-handling. Ваш ответ также находится в связанном сообщении. – chris

+0

бит, память выделяется на стеке. компилятор просто должен генерировать инструкции для увеличения указателя стека для размера * sizeof (int). –

+0

@chris: * Как это делается, отличается от * почему * разрешено в компиляторе. По общему признанию, похоже, что на самом деле намерение не могло понять реализацию, но, скорее, * почему * он компилирует ... –

ответ

2

Это расширение на стороне компилятора. Как это работает? Ну, он работает только до некоторой степени.

Реализация в основном перемещает указатель стека величиной, зависящей от размера массива, и вызывает память посередине по имени массива. Это работает лишь в некоторой степени, потому что в VLA размер не является неотъемлемой частью этого типа, а это означает, что многие конструкции, которые могут использоваться на регулярных массивах, не могут быть выполнены с этим типом, например, если передать массив в шаблон по ссылке ... sizeof обычно поставляется, но реализован как конструкция времени выполнения.

0

myArray в вашем примере выделен в стеке. g ++ имеет расширение, которое позволяет использовать этот трюк. Куча не нужна для этого, компилятор просто генерирует код, чтобы увеличить указатель стека на сумму, которая вычисляется во время выполнения.

0

VLA - это расширение , многие реализации имеют собственные расширения для языка C++. Если вы хотите, чтобы g ++ жаловался, что вы не придерживаетесь стандарта, пройдите флаг -pedantic. VLAs находятся в стеке, что очень быстро, однако это также является причиной проблем, поскольку у вас ограниченное пространство стека. Однако в C++ у нас есть такие конструкции, как std::vector и т. Д., Поэтому нет необходимости в использовании.