Переменные внутри функции
Модератор: Модераторы разделов
-
- Сообщения: 812
- ОС: Slackware64
Переменные внутри функции
Доброго времени суток!
Есть у меня, скажем, функция void tmp(), я объявил в ней переменные unsigned int q, w, e. В программе я вызвал эту функцию, она выполнилась и что станет с переменными? В стандарте есть такой пункт, что они должны уйти из памяти(ну или регистров процессора) или лучше самому проконтролировать посредством malloc(), free()?
Есть у меня, скажем, функция void tmp(), я объявил в ней переменные unsigned int q, w, e. В программе я вызвал эту функцию, она выполнилась и что станет с переменными? В стандарте есть такой пункт, что они должны уйти из памяти(ну или регистров процессора) или лучше самому проконтролировать посредством malloc(), free()?
-
- Сообщения: 339
- Статус: hikki
- ОС: Arch
Re: Переменные внутри функции
malloc() и free() работает же с указателями, вроде бы...
А переменные нормально сами "уйдут", если не указатели они.
А переменные нормально сами "уйдут", если не указатели они.
Blog: hikki-tech
-
- Сообщения: 812
- ОС: Slackware64
-
- Сообщения: 83
- ОС: Debian testing
Re: Переменные внутри функции
Автоматические переменные создаются на стеке, при выходе из функции указатель стека перемещается и переменные уничтожаются.
-
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Переменные внутри функции
Если только они не static.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Переменные внутри функции
О-хо-хонюшки. Это ж основы, где Вы их пропустили?
Есть 3 вида памяти: статическая, стек, динамическая. Ну, также регистры, но то немного в стороне.
Все глобальные и статические переменные находятся в статической памяти - т.е. не повляются и не уничтожаются в течение времени жизни программы.
Все локальные переменные, а также параметры выделяются в стеке, при выходе из функции локальные переменные освобождаются путем увеличения головы стека. На практике это может быть не совсем так в связи с оптимизациями, но то другой разговор. Параметры освобождаются в соответствии с правилами вызова - вызываемой или вызывающей функцией.
Для работы с динамической памятью и только с ней используются функции malloc и free.
Есть 3 вида памяти: статическая, стек, динамическая. Ну, также регистры, но то немного в стороне.
Все глобальные и статические переменные находятся в статической памяти - т.е. не повляются и не уничтожаются в течение времени жизни программы.
Все локальные переменные, а также параметры выделяются в стеке, при выходе из функции локальные переменные освобождаются путем увеличения головы стека. На практике это может быть не совсем так в связи с оптимизациями, но то другой разговор. Параметры освобождаются в соответствии с правилами вызова - вызываемой или вызывающей функцией.
Для работы с динамической памятью и только с ней используются функции malloc и free.
-
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
Re: Переменные внутри функции
Это свойство конкретного языка программирования, а именно от области видимости.
Desipere in loco
-
- Сообщения: 812
- ОС: Slackware64
Re: Переменные внутри функции
Теория!=Практика.
Есть 3 вида памяти: статическая, стек, динамическая. Ну, также регистры, но то немного в стороне.
Все глобальные и статические переменные находятся в статической памяти - т.е. не повляются и не уничтожаются в течение времени жизни программы.
Все локальные переменные, а также параметры выделяются в стеке, при выходе из функции локальные переменные освобождаются путем увеличения головы стека. На практике это может быть не совсем так в связи с оптимизациями, но то другой разговор. Параметры освобождаются в соответствии с правилами вызова - вызываемой или вызывающей функцией.
Для работы с динамической памятью и только с ней используются функции malloc и free.
Это я знаю.
-
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Переменные внутри функции
Ассемблер вам батенька надо изучить... И читать теорию, много читать.
-
- Администратор
- Сообщения: 5410
- ОС: Gentoo
Re: Переменные внутри функции
BratSinot писал(а): ↑19.05.2011 13:34Есть 3 вида памяти: статическая, стек, динамическая. Ну, также регистры, но то немного в стороне.
Все глобальные и статические переменные находятся в статической памяти - т.е. не повляются и не уничтожаются в течение времени жизни программы.
Все локальные переменные, а также параметры выделяются в стеке, при выходе из функции локальные переменные освобождаются путем увеличения головы стека. На практике это может быть не совсем так в связи с оптимизациями, но то другой разговор. Параметры освобождаются в соответствии с правилами вызова - вызываемой или вызывающей функцией.
Для работы с динамической памятью и только с ней используются функции malloc и free.
Это я знаю.
Если знаете, то к чему тогда эта тема?
-
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
-
- Сообщения: 812
- ОС: Slackware64
Re: Переменные внутри функции
/dev/random писал(а): ↑19.05.2011 13:47BratSinot писал(а): ↑19.05.2011 13:34Есть 3 вида памяти: статическая, стек, динамическая. Ну, также регистры, но то немного в стороне.
Все глобальные и статические переменные находятся в статической памяти - т.е. не повляются и не уничтожаются в течение времени жизни программы.
Все локальные переменные, а также параметры выделяются в стеке, при выходе из функции локальные переменные освобождаются путем увеличения головы стека. На практике это может быть не совсем так в связи с оптимизациями, но то другой разговор. Параметры освобождаются в соответствии с правилами вызова - вызываемой или вызывающей функцией.
Для работы с динамической памятью и только с ней используются функции malloc и free.
Это я знаю.
Если знаете, то к чему тогда эта тема?
Еще раз, теория!=практика. Единственный язык в котором можно на 99% быть уверенным что произойдет, это язык ассемблера.
-
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
-
- Администратор
- Сообщения: 5410
- ОС: Gentoo
Re: Переменные внутри функции
Теория в таких вещах гораздо точнее практики. К примеру, некоторые умники привыкли, что на практике memcpy() всегда копирует от начала к концу, и тут ВНЕЗАПНО в некоторых версиях glibc она начала копировать от конца к началу. И их программы накрылись медным тазом. А ведь теория их предупреждала, что направление копирования memcpy() _не определено_.
-
- Сообщения: 812
- ОС: Slackware64
Re: Переменные внутри функции
Это не тот момент.
Вопрос по блоку операторов. В теории в них переменная объявилась и по выходу из них делается то, о чем мы выше говорили.
Вопрос по блоку операторов. В теории в них переменная объявилась и по выходу из них делается то, о чем мы выше говорили.
Код: Выделить всё
_Bool main(void)
{
if(<что-то>)
{
long double qwe;
<что-то происходит>
}
//Или такой вариант:
{
long double qwe;
<что-то происходит>
}
return 0;
}
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Переменные внутри функции
посмотрте скомпилированый код. там всё просто на самом деле.
да. если в первом блоке qwe = 17, то во втором её значение не определено по стандарту, но на практике будет 17. Обычно. Но я-бы за такое вас уволил. И даже перестал-бы здороваться :(
Потому, что в самый важный момент, там нарисовалось-бы ВНЕЗАПНО 666. :(
что вас волнует? негативный вопрос? Может-ли злоумышленник узнать значения ваших данных из вашего стека? Ответ - да.
Позитивный вопрос? Можете-ли вы быть уверенны в сохранности использованного стека? Ответ - нет.
На практике всё будет отлично работать в тестах, и рухнет в продакшене.
-
- Сообщения: 812
- ОС: Slackware64
Re: Переменные внутри функции
да. если в первом блоке qwe = 17, то во втором её значение не определено по стандарту, но на практике будет 17. Обычно. Но я-бы за такое вас уволил. И даже перестал-бы здороваться
Потому, что в самый важный момент, там нарисовалось-бы ВНЕЗАПНО 666.
Кто мне там про теорию заливал? По стандарту, после первого блока переменная "уничтожается"(не знаю как это правильно назвать), а во втором блоке создается другая и вконце блока "уничтожается".
P.S. Вы точно про блоки правильно меня поняли?
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Переменные внутри функции
не было такого в стандарте. она выходит из области видимости. а когда входит - неопределённое значение. попробуйте.
-
- Сообщения: 812
- ОС: Slackware64
Re: Переменные внутри функции
А то при обычном объявлении переменной без инициализации значение определенное? У меня в программе такие вещи временные, вроде перевалочных пунктов, например при замене переменных местами.
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Переменные внутри функции
Никто ее не уничтожает. В "куче" при инициализации выделяется место, туда заносится значение. Когда вы выходите из области видимости переменной, занятая ею область "кучи" помечается как свободная. Но значение там продолжает храниться. Пока его не затрет другая переменная, если ей место там же будет выделено.
Вы же при удалении файла с диска не считаете, что занимаемые им блоки забиваются нулями/etc (конечно, если shred какой-нибудь не используете)?
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Переменные внутри функции
eddy, поправка, если говорим о локальных переменных - то стек, а не куча.
-
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: Переменные внутри функции
Извиняюсь, вечно я их путаю...
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка

-
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Переменные внутри функции
нельзя сказать, что с точки зрения [не]очистки памяти они как-то принципиально отличаются.
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Переменные внутри функции
o_O
Отличаются как раз принципиально - стек работает по принципу стека (что не удивительно) - освобождаюся переменные в порядке обратном выделению. За счёт такого ограничения работает крайне быстро. В куче порядок освобождения произволен (что делает выделение/освобождение памяти более длительным процессом, возникает проблема фрагментации памяти и т.д.). Поэтому и куча - что всё свалено и порядка нет.
Ну и в силу своей простоты стек более тесно интегрирован в языки программирования - следить за удалением в стеке не надо. В куче такое невозможно - удаление можно опустить только в случае сборщика мусора или хотя бы умных указателей и т.п. обёрток.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Переменные внутри функции
нет
{int x,y;}
{int y,x;}
? убивать за такое надо.
-
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Переменные внутри функции
угу.
есть три отличия:
1) распределитель new может использовать св. память в своих целях.
2) отладочный new может забивать чем-то память.
3) и наконец, new можно перезагрузить.
та не. это не принципиально. часто распределитель new работает как стек.
куча возникает как раз в том случае, если new/delete не угадали стратегию распределения памяти.
почему "невозможно"? возможно. и даже используется на практике (delete, который ничего не делает). задачи-то разные бывают... Кроме того, можно сделать например очередь - delete удаляет самый старый эл-т. А если delete пытается удалить не самый старый - ничего не происходит. Либо его выполнение откладывается - создаётся стек отложенных delete, и если удалился 17й эл-т, мы проверяем, не нужно-ли удалить за одно и 18й. Конечно, можно также сделать и стек.
сборщики мусора в С++ не очень хорошо работают. неоправданно сложная реализация. ИМХО.
-
- Сообщения: 2142
- Статус: *бунту ненавистник
- ОС: linux
Re: Переменные внутри функции
И Ada (по крайней мере в GNAT Pro.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Переменные внутри функции
drBatty писал(а): ↑12.06.2011 02:29
почему "невозможно"? возможно. и даже используется на практике (delete, который ничего не делает). задачи-то разные бывают... Кроме того, можно сделать например очередь - delete удаляет самый старый эл-т. А если delete пытается удалить не самый старый - ничего не происходит.
Нет, не то. Невозможно не вызывать delete, чтобы ЯП сам опознавал - нужен нам объект или нет. При работе со стеком явно определена область видимости и существования. В случае кучи, существование - хз когда нужно удалить. Без сборщика мусора этого не сделать. Всякие умные указатели - половинное решение, поскольку допускают утечки памяти при циклических ссылках.
-
- Сообщения: 1445
- ОС: Debian Squeeze
Re: Переменные внутри функции
NickLion
Есть сборщики мусора и для C++. Один из них - http://sourceforge.net/projects/libgc/
ИМХО, это не совсем удобно, но оно есть и даже работает.
Есть сборщики мусора и для C++. Один из них - http://sourceforge.net/projects/libgc/
ИМХО, это не совсем удобно, но оно есть и даже работает.
-
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Переменные внутри функции
frp писал(а): ↑12.06.2011 16:02NickLion
Есть сборщики мусора и для C++. Один из них - http://sourceforge.net/projects/libgc/
ИМХО, это не совсем удобно, но оно есть и даже работает.
Я не говорю, что их нет. Вопрос в том, что это не свойство языка C++. И даже если это особенность языка, то реализация представляет собой сложнейший процесс. Даже простейщий сборщик мусора - это необходимость хранения дерева связей ссылок и проход по нему. К тому же в том же C++ при передаче ссылки не на начало блока, а на середину всё становится намного хуже. Управляемые языки в этом плане ограничивают, но позволяют реализовать нормальный сборщик мусора (ценой снижения производительнорсти работы с указателями). В общем, рассуждать можно много, но суть в том, что стек и куча имеют общую глобалную цель, но задачи перед ними стоят разные.