Что на самом деле означает LIFO? - PullRequest
0 голосов
/ 08 декабря 2011

Как уже упоминалось в этом руководстве: http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

В компьютерном программировании стек - это контейнер, который содержит другие переменные (во многом как массив).Однако, хотя массив позволяет вам получать доступ к элементам и изменять их в любом порядке, стек более ограничен.Операции, которые могут выполняться над стеком, идентичны приведенным выше:

1) Посмотрите на верхний элемент в стеке (обычно это делается с помощью функции top ()). 2) Снимите верхний элемент.стека (выполняется с помощью функции pop ()) 3) Поместить новый элемент поверх стека (выполняется с помощью функции push ())

Но если я определил две переменные вC ++ Мне не нужно использовать их в том же порядке определения:

Пример:

int main() {
 int a;
 int b;

 b = 5;
 a = 6;
}

Есть ли проблема в этом коде?Я могу использовать их в любом порядке, который мне нравится !!Мне не нужно сначала использовать a , а затем b .

Я что-то неправильно понимаю?Что это?

Ответы [ 7 ]

8 голосов
/ 08 декабря 2011

Вы путаете два разных типа стеков.

Один стек - это место, где выделяется часть памяти для вашего приложения.Это будет частью дискуссии о стеке и куче, а также о том, где выделена ваша память.

Другой вид стека - это структура данных, которая соответствует стилю доступа LIFO.Это может быть реализовано с использованием std :: vector или других форм структур данных.

4 голосов
/ 08 декабря 2011

Да, «автоматическое хранилище», в котором хранятся локальные переменные вызываемого метода, размещается в стеке.Но с автоматическим стеком хранения вы помещаете и извлекаете (изменяемого размера) «кадры стека», которые содержат все локальные переменные для метода, а не отдельные значения.

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

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

1 голос
/ 08 декабря 2011

Вам не нужно использовать их в указанном порядке. Но они уничтожены - сняты со стека - в таком порядке. LIFO не относится к доступу, он просто включает или снимает вещи со стека.

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

1 голос
/ 08 декабря 2011

Как и любая другая структура данных, стек - это структура данных, которая следует принципу LIFO (последний пришел первым вышел). Как уже упоминалось в вашем вопросе, он выполняет операции push и pop для ввода и извлечения данных в соответствии с принципом LIFO.

Каждый процесс состоит в основном из 4 частей адресного пространства, которые доступны для процесса, когда он выполняется

Текст - эта часть содержит фактические выполняемые инструкции m / c.Во многих операционных системах этот параметр установлен только для чтения, поэтому процесс не может изменять свои инструкции.Это позволяет нескольким экземплярам программы совместно использовать одну копию текста.

Данные - эта часть содержит часть данных программы.Далее он делится на

1) Инициализированные данные только для чтения - он содержит элементы данных, которые инициализируются программой, и они читаются только во время выполнения процесса.

2) Инициализированное чтениеЗапись данных. Содержит элементы данных, которые инициализируются программой и будут изменены в ходе выполнения процесса.

3) Неинициализированные данные. Содержит элементы, которые не были инициализированы программой и имеют значение 0.до выполнения процессов.Они также могут быть изменены и обозначены как BSS (символ начала блока).Преимуществом таких элементов является то, что системе не нужно выделять место в программном файле для этой области, потому что она инициализируется в 0 операционной системой до того, как процесс начнет выполняться.

Stack - эта частьиспользуется для локальных переменных, стековых фреймов

Heap - эта часть содержит динамически распределенную память

int abc = 1;                            ---->   Initialized Read-Write Data
char *str;                              ---->   BSS
const int i = 10;                       ----->  Initialized Read-Only Data

main()
{
    int ii,a=1,b=2,c;                            ----->  Local Variables on 
Stack

    char *ptr;
    ptr = malloc(4);                     ------> Allocated Memory in Heap

     c= a+b;                             ------> Text

}

Данные, данные для хранения Текст, код для хранения

Есть 3 (main?) сегменты / разделы файла, создаваемые компоновщиком.текст - текст программы (и, видимо, массивы const char. возможно, другие массивы 'const', так как они не могут быть изменены в любом случае).Я не уверен на 100% в части массива, возможно, кто-то меня поправит.

data - инициализированные глобальные данные.см. примеры ниже.bss - неинициализированные глобальные данные.Вот несколько примеров

int x = 1;    /* goes into data */
int y;        /* goes into bss  */
const int z = 1;

, мы видели, что идут в «текст», так как не могут быть изменены в любом случае, но могут быть защищены

const char array[] = {'a','b'....etc}


/* the rest goes into text */

int main(void)
   {
     return EXIT_SUCCESS;
   }

Блок, начатый символом

(BSS) Сегмент неинициализированных данных, созданный линкерами Unix.Другие сегменты представляют собой «текстовый» сегмент, который содержит программный код, а «информационный» сегмент содержит инициализированные данные.Объекты в сегменте bss имеют только имя и размер, но не имеют значения.

1 голос
/ 08 декабря 2011

Я что-то неправильно понимаю?Что это?

«Стек», в который вы помещаете «a» и «b», (ПРЕДУПРЕЖДАЕТ О ОГРОМНОМ ОГРОМНОМ УПРОЩЕНИИ И КОНЦЕПТУАЛИЗАЦИЯХ) не состоит из переменных;это сделано из кадров стека.Кадр стека состоит из параметров функции и пространства для ее возвращаемого значения, а иногда и переменных, используемых внутри функции (за исключением того, что они также могут храниться в регистрах, а иногда параметры также передаются через регистры).«Вставка» в этот стек осуществляется путем вызова функции.«Выскочить» из этого стека осуществляется путем возврата из функции.У вас действительно есть доступ только к «верхнему» элементу;Вы не можете просто прочитать переменные функции, вызвавшей текущую функцию, если они явно не были переданы в качестве параметров.

0 голосов
/ 08 декабря 2011

Программа стека:

Ваш пример программы не является реализацией стека.В стеке должны храниться такие элементы, как массив (или каким-либо образом), в котором элементы могут быть помещены (сохранены) или извлечены (извлечены) в порядке LIFO (последний пришел первым вышел).Его реализация не так проста, как объявление двух переменных.Стандартный C ++ предоставляет класс стека, так что вы можете использовать его без самостоятельной реализации.

Память стека:

Переменные в функции хранятся в памяти стека (Где-то в оперативке) в порядке LIFO.В вашем примере переменная a будет создана и помещена в стек памяти.Затем переменная b помещается в стек памяти.После завершения функции переменные уничтожаются в режиме LIFO.Таким образом, переменная b уничтожается первой и, наконец, уничтожается переменная a.Вы не пишете код для этого.Компилятор позаботится о том, чтобы написать для него код низкого уровня сборки.

0 голосов
/ 08 декабря 2011

Стек - это стандартная структура данных, которая используется повсеместно. Так называемый стек потока на самом деле является реализацией этой парадигмы. Есть указатель стека (обычно в регистре процессора), который указывает на область памяти. Данные «помещаются» в этот стек, перемещая sp. Мы «выскакиваем», возвращая значение, на которое оно указывает, и перемещая sp в противоположном направлении.

Насколько ваши a, b заявлены выше, это не имеет значения. Они оба распределены, прежде чем они привыкнут.

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