2015-11-29 8 views
0

Недавно для удовольствия я решил построить игрушечное программирование, компилятор и vm. Начав внедрять виртуальную машину, я застрял. Стек, который содержит переменные и структуры, которые я реализовал как отдельные массивы для каждого типа. Проблема в том, что когда у меня есть ссылка на структуру, элементы не выровнены, int struct.x может находиться по адресу 2, а float struct.y может быть по адресу 56, поэтому доступ к структуре по ссылке будет невозможным, потому что индексы не линейны. Как я могу это решить?Реализация стека для виртуальной машины C++

редактировать:
первую очередь для каждого типа я имею в виду для каждого примитива, а второй я знаю, что я мог бы осуществить это с профсоюзами, но я хочу, чтобы узнать, как он на самом деле реализуется в Java, C++ или C#, это своего рода чтобы сделать игрушечный язык, чтобы лучше понять, что вы программируете.

+0

Когда вы говорите отдельный массив для каждого типа, вы имеете в виду каждый примитивный тип? Это не будет работать по той причине, которую вы описываете; вы должны хранить каждый тип класса смежно. Почему не один массив/стек? Или даже добавить один для всех не примитивных типов. (Или, возможно, один массив для каждого требуемого выравнивания.) –

+0

Объявите стек как массив * union *. Поэтому каждый слот в стеке может хранить любую переменную. Отходы памяти, но это всего лишь игрушка, и у вас много. –

+0

Alan Stokes, я не могу объявить массив с разными типами, которым я все еще могу манипулировать, по крайней мере, того, что я знаю в C++. – Coder3000

ответ

0

в этом случае, у вас нет реального выбора, кроме как использовать один тип данных, как uin32_t/uint64_t и просто имеют значение разрыва компилятора вниз в целое

int sp = 0; 
uint32_t stack[MAX_STACK_SIZE]; 

ИЛИ

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

union values { 
    int i; 
    float f; 
}; 
struct Type { 
    int tag; 
    union values val; 
}; 
Type stack[MAX_STACK_SIZE]; 

Это зависит от вас, чтобы принять решение об этом, но это обычно так, как это делается.

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

  • Нет связанных вопросов^_^