2016-03-14 4 views
3

Я знаю, что variable test 5 cells allot не гарантирует выделение непрерывного блока памяти, а create test 1 , 2 , 3 , 4 , 5 , определенно создаст непрерывный блок памяти.Сопряженная память в больших массивах?

variable определяется как : variable create 0 , ;

ли allot ИНГ больше клеток переменной не гарантировано, чтобы расширить блок памяти смежно, потому что create можно назвать только один раз за слово?

Пример:

create test 1 , 2 , test 3 , 4 , 5 , < < < < Это не обязательно будет расширить массив смежно, правильно?

Являются ли мои предположения правильными?

+0

Из-за использования тега 'gforth', неясно, относится ли ваш вопрос к стандарту Forth или более конкретно к Gforth. –

+0

@LarsBrinkhoff Вопрос о Standard Forth, я использовал только тег 'gforth', чтобы показать, какой из них я использовал. Но я должен был просто написать, что я использовал gforth, не используя тег. – Byte

ответ

6
  • Формулировка в стандарте дает VARIABLE и CREATE свободу, чтобы положить данные в различных областях памяти. Если они это сделают, то, очевидно, CREATE или ALLOT не могут распространять регион, созданный VARIABLE.

  • CREATE можно назвать много раз из любого слова.

  • Ваш пример может не совсем поступить так, как вы думаете. Вторая строка вызывает test, оставив свой адрес в стеке. Затем он закладывает три ячейки, которые расширяют область, выделенную для test.

  • Ваше предположение об определении VARIABLE неверно для всех реализаций.

+0

Если я добавил слово слова «create» в словарь, следующее добавило другое слово (например, 'test2'), а затем попыталось расширить первое слово с помощью« n1, n2 », оно может быть не смежным? Если это так, то итерация массива с помощью '1 cell + loop' создаст семантическую ошибку? – Byte

+0

Нет, это не связано с добавлением нового определения. –

+1

',' принимает номер из стека, помещает его в текущий адрес памяти пользовательских данных, а затем увеличивает текущий адрес данных пользователя по размеру адреса. Этот адрес обычно находится в переменной DP. Итак, определение может быть следующим: ':, DP @! DP @ CELL + DP! ; ' – VoidVolker

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