#1 15.10.15 10:57
Вопрос для студентов программистов
В последнее время активно изучаю компилятор Си++, конкретно g++ под линукс. До этого долго изучал компилятор Си - gcc. Методика изучения такая: пишешь маленькую программу на Си++, компилируешь ее, потом дисассемблируешь и смотришь, как компилятор сформировал код. Чем больше я вникал в суть работы компилятора, тем больше у меня вставал вопрос к книгам для обучения программированию на Си++.
Так вот, простой отрывок текста из книги: C++. Руководство для начинающих. Герберт Шилдт, стр 225.
Важно понимать, что локальные переменные существуют только во время выполнения программного блока, в котором они объявлены. Это означает, что локальная переменная создается при входе в "свой" блок и разрушается при выходе из него. А поскольку локальная переменная разрушается при выходе из "своего" блока, ее значение теряется.
Спрашивается, что ее разрушает, что за невидимая сила это делает? То, что она со временем разрушается (переписывается), я согласен, так как локальная переменная сохраняется в стеке, но не сразу после выхода из блока. Ну и после выхода из блока, значение ее тоже не теряется. Мне достаточно сохранить на нее указатель, и значение переменной будет доступно в любом другом блоке. Видимость локальной переменной на самом деле ограничена самим компилятором, а не чем то таким, что не дает доступ к ней из других блоков. Тоже самое, к стати, относится и к "Инкапсуля́ция" в С++.
А теперь вопрос: Вас тоже этому учат наши преподаватели по программированию, не объясняют нюансы работы стека и размещения локальных переменных в нем?
Исправлено kai (15.10.15 11:08)
Offline
#2 12.11.15 08:34
Re: Вопрос для студентов программистов
локальная переменная сохраняется в стеке, но не сразу после выхода из блока. Ну и после выхода из блока, значение ее тоже не теряется
никто не дает тебе гарантий, когда она будет переписана.
Она может быть не переписана вовсе, или же переписана сразу по выходу из блока.
Мне достаточно сохранить на нее указатель, и значение переменной будет доступно в любом другом блоке.
Грубейшая ошибка. Указатель на невалидные данные.
Кстати говоря, не все компиляторы ограничивают область видимости переменной блоком. Я встречал такие (давно, лет 10 назад), которые продолжают область видимость до конца конца функции.
Offline

