Ada_Ru форум

Обсуждение языка Ада

Размещение массива.

Оставить новое сообщение

Сообщения

Alexey Veselovsky
Размещение массива.
2009-03-23 07:26:29

type Arr is array (Natural range <>) of Natural;

 

procedure Foo (N : Natural) is

MyArray : Arr (1 .. N);

begin

-- procedure body

end Foo;

 

Вопрос -- где будет размещено содержимое массива MyArray? В стеке, или в куче?

Alexey Veselovsky wrote:

type Arr is array (Natural range <>) of Natural;

 

procedure Foo (N : Natural) is

MyArray : Arr (1 .. N);

begin

-- procedure body

end Foo;

 

Вопрос -- где будет размещено содержимое массива MyArray? В стеке, или в куче?

 

Теоретически - в стеке. Вызов тела процедуры начинается с

отведения в стеке памяти для локальных объявлений, что происходит при

обработке (elaboration) соответствующих объявлений объектов данных. В момент обработки

 

MyArray : Arr (1 .. N);

 

значение N вполне известно - зачем тут куча?

 

Что реально делает компилятор - так можно посмотреть при желании :)

Вопрос -- где будет размещено содержимое массива MyArray? В стеке, или в куче?

 

Теоретически - в стеке. Вызов тела процедуры начинается с

отведения в стеке памяти для локальных объявлений, что происходит при

обработке (elaboration) соответствующих объявлений объектов данных.

В момент обработки

 

MyArray : Arr (1 .. N);

 

значение N вполне известно - зачем тут куча?

 

Ну, а если N достаточно велико? Стэк он маленький, а куча она больша-ая...

 

День добрый!

----- Original Message ----- From: "Alexey Veselovsky" <alexey.veselovsky@...>

To: <ada_ru@yahoogroups.com>

Sent: Monday, March 23, 2009 11:03 AM

Subject: [ada_ru] Re: Размещение массива.

Вопрос -- где будет размещено содержимое массива MyArray? В стеке, или в

куче?

 

Теоретически - в стеке. Вызов тела процедуры начинается с

отведения в стеке памяти для локальных объявлений, что происходит при

обработке (elaboration) соответствующих объявлений объектов данных.

В момент обработки

 

MyArray : Arr (1 .. N);

 

значение N вполне известно - зачем тут куча?

 

Ну, а если N достаточно велико? Стэк он маленький, а куча она больша-ая...

 

Кстати каким ключем а лучше прагмой для компоновщика можно сделать максимально возможный большой СТЕК, для GNAT for Windows x86?

Будет ли GNAT GPL 2009 for Windows i64?

 

With best regards

Sergey Kirkorov www.mediascan.by

Email: ksiby@...

On Mon, Mar 23, 2009 at 02:49:17PM +0200, Sergey Kirkorov wrote:

 

 

MyArray : Arr (1 .. N);

 

значение N вполне известно - зачем тут куча?

 

Ну, а если N достаточно велико? Стэк он маленький, а куча она больша-ая...

 

Может быть и на оборот, стек большой, а куча маленькая :) По сути это области в одной памяти.

 

Если размер MyArray больше оставшегося места в стеке, будет возбуждено исключение Storage_Error. Но это поведение в GNAT выключено по

умолчанию. Чтобы включить нужно компилировать с ключом -fstack-check

 

Кстати каким ключем а лучше прагмой для компоновщика можно сделать максимально возможный большой СТЕК, для GNAT for Windows x86?

Будет ли GNAT GPL 2009 for Windows i64?

 

 

Позновательно просмотреть главу Stack Related Facilities в GNAT UG http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/Stack-Related-Facilities.html

Вкрадце: есть стек основной процедуры (задачи) и стеки вложенных

задач. Размер первого стека задается системными вещами, типа ulimit -s в *nix, и дополнительно может быть ограничен переменной окружения GNAT_STACK_LIMIT. Размер стеков вложенных задач определяется прагмой Storage_Size для описания задачи, если прагмы нет действует значение по умолчанию, которое можно поменять при компиляции через -bargs -d

Т.е. основная процедура может жрать стек пока ОС позволяет, а

стек вложенных задачь прийдеться ограничить зарание (до момента

создания задачи).

 

На 32-х битных задачах следует также учесть ограничения виртуальной памяти. Например выделив каждой задаче по 2Мб памяти, можно создать 2048 задач, на что уйдет 2 Гб виртуальной памяти. Создать больше

задач вряли получеится, даже если физической памяти эти задачи

используют совсем чуть-чуть. Размер виртуальной памяти пользовательской программы зависит от ОС, обычно 2-3 Гб, в любом случае не больше 4Гб.

--

Maxim Reznik

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти