Где реально храняться данные


4 0

Блин, только выпустил обновление Библии С# и забыл в нем уточнить по поводу простых переменных и структур. Дело в том, что я написал, что их компилятор располагает их в стеке, но это не всегда правда. Так пишут все авторы, но если быть уж совсем точным, то компилятор не обязан располагать переменные в стеке. Обычная практика - он старается делать это. Я специально полез в интернет и увидел кучу статей, в которых пишут про то, что простые переменные будут в стеке.

Возьмем, например, статью .NET: Type Fundamentals еще за 2000 год из самого MSDN. В ней утверждается, что простая переменная будет расположена в стеке:

System.Int32 a = new System.Int32(5); When this statement is compiled, the compiler detects that the System.Int32 type is a value type and optimizes the resulting IL code so that this "object" is not allocated from the heap; instead, this object is placed on the thread's stack in the local variable a.

Подобных высказываний можно встретить кучу, и это не ошибка. Ни в коем случае. Компилятор (по крайней мере от Microsoft) действительно будет стараться расположить переменную в стеке, но может выкинуть и в кучу. Нет закона, требующего использовать стек для простых типов данных. Поэтому другой компилятор может не использовать стек вообще. Не забываем, ведь .NET межплатформенный и открытый. Кто угодно может написать компилятор под его IL код и этот код может выполняться на любой платформе. В данном случае понимаем платформу железа. И вполне могут быть устройства, которые не умеют или не хотят работать со стеком и тогда компилятор под это железо имеет право поместить простое число куда угодно, даже в регистр.

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

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


Понравилось? Кликни Лайк, чтобы я знал, какой контент более интересен читателям. Заметку пока еще никто не лайкал и ты можешь быть первым


Комментарии

Topal

11 Ноября 2010

а где это может понадобится, в стеки переменные хранятся или в куче?


Михаил Фленов

11 Ноября 2010

В случае с .NET наверно нигде. Ты все равно влиять на это не можешь. Но просто для общего развития знать не помешает.


oleg

11 Ноября 2010

А что, книги написанные вами в начала 2000-х всё ещё активно продаются?


Михаил Фленов

11 Ноября 2010

Их уже давно нет в продаже


Добавить Комментарий

Еще что-нибудь

Хотите найти еще что-то интересное почитать? Можно попробовать отфильтровать заметки на блоге по категориям.

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне