1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
|
||||||
1 | ||||||
два мелких вопроса на счет переменных17.09.2009, 22:08. Показов 1420. Ответов 19
у меня возник такой вопрос: скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
А что если у меня глобальные переменные с большим местом?Тогда оперативка должна каждый раз так работать?Или я что то не знаю? =========================== еще один вопрос на счет переменных,в кИр увидел такой код,коды то есть
буду рад ответам.
0
|
17.09.2009, 22:08 | |
Ответы с готовыми решениями:
19
3 мелких вопроса 2 мелких вопроса по основам сетей Два вопроса Два вопроса по IE: |
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|||||||||||
17.09.2009, 22:17 | 2 | ||||||||||
С помощью return ты передаешь управление вызвавшему процессу, а переменная х (как и y, z, и прочее что там было определено) уничтожается при выходе из области видимости (точнее, в случае main, при завершении процесса).
Возможно, имелось ввиду это:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.09.2009, 22:23 | 4 |
Ответ на первый вопрос.
Значит, при возвращении ты НЕ обнуляешь ячейку памяти, где хранилось значение переменной x То есть если в функции под переменную int x= 1234 была отведена ячейка, допустим, с номером 0X22ffee. И пусть функция x возвращает эту переменную. Тогда После такой записи int d= f (); В ячейке памяти, которая отведена под переменную d (допустим 0X224400) появится значение 1234. И это же значение ОСТАНЕТСЯ в ячейке 0X22ffee Просто напросто прога не будет больше обращаться к этой ячейке и всё. Почему не обнуляет? Потому, что это лишние ресурсы. Можно просто не обращаться к этой области памяти и всё. ...А что глобальные? Если ты их явно обнулишь, то они обнулятся, если нет, то нет. P.S. Медвед, скачай отладчик OllyDbg и своими глазами всё увидь.
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
17.09.2009, 22:38 | 6 |
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Очищать имеет смысл только структуры данных (классы, динамические массивы)
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.09.2009, 23:03 | 7 |
Нет, не бессмысленно.
Короче, медвед, скачивай отладчик и смотри. И помни само собой ничего не обнуляется. В том смысле, чтобы занести в ячейку 402000 некоторые данные, (обнулить, доопустим) процессор должен выполнить такие команды. MOV EAX, 0 MOV DWORD PTR DS:[402000],EAX Что они значат, пока неважно. Но они ДОЛЖНЫ быть выполнены. Теперь смотри. Ты обнулял? Нет. Откуда им взяться в коде процессора? Операционной системе нет дела до того, что творится в адресном пространстве твоей программы. Она не вмешивается сюда. Штука, называемая средой программмирования, в принципе может так сделать-сделать исходый код, что обнуление будет присутвтвовать автоматом. Но зачем опять же? Что бы ты подольше сидел курил, когда у тебя рекурсия выполняется? Если проге необходимо занести данные в ячейку памяти, то на возможнсоть это сделать содержание ячейки не влияет абсолютно. Скачивай отладчик и смотри.
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
17.09.2009, 23:09 | 8 |
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.09.2009, 23:15 | 9 |
Имелось ввиду- какой смысл присваивать переменой x значение 0, если оно (см. цитату выше). И так будет нулём.
Я сказал, что нулём оно не будет. Надо тебе обнулять- обнуляй руками. ...Только щас задумался- а каким образом? Ну, вышли мы из функции. Ну, надо нам, допустим обнулить ту ячейку памяти, которая в ОТРАБОТАВШЕЙ функции задействована? Не вижу я способов. Не задумывался я над ними. Не было необходимости.
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
17.09.2009, 23:23 | 10 |
ну, обнулить можно и перед выходом... только ЗАЧЕМ? Я считаю это бессмысленным, (а вы говорите что не бессмысленно) потому как это простая переменная, и уничтожиться она сама, (в том смысле что не будет утечки памяти)... это же не класс какой-нибудь, который резервирует память и если его не очистить он не отдасть зарезервированную под его хранение память...
Добавлено через 28 секунд PS кажется, мы друг друга не поняли
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
17.09.2009, 23:41 | 11 |
Если ты глобальной переменной типа int ты ничего не присваивал - но ее значение все равно будет 0. Добавлено через 1 минуту Добавлено через 2 минуты
1
|
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
|
||||||
17.09.2009, 23:42 | 12 | |||||
это значит, что сначала в регистр eax заносим нужное нам значение, а потом записываем значение eax в указатель. Почему нельзя просто?
Не важно, что хранится по адресу - переменная, обьект(ну нету такого понятия как класс по отношению к памяти, есть только обьекты), массив, etc. все равно по закрытию процесса все ресурсы выделенные потоку(потокам) этого процесса буду помечены как свободные для записи и там будет тот мусор, которые вы можете наблюдать когда вылезете за пределы выделеной вам памяти. Смысла в том чтобы принудительно что-либо обнулять нету. И поверьте, то что пишут в книгах типа "удаляйте динамически выделенную память под массивы" - это они вырабатывают в вас привычку это делать, но для массивов даже в 1000 элементов делать это бессмысленно. Это имеет смысл тогда когда идут реально большие затраты ресурсов памяти, которые необходимо периодически освобождать, чтобы зря не загружать ОЗУ.
0
|
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
|
|
17.09.2009, 23:47 | 13 |
А иначе ты будешь писать кривой КОД с утечками памяти !!! И потом есть программы-серверы, которые сутками крутятся. Есть сами операционные системы - тоже сутками крутятся. Все нужно делать корректно. Только для учебных целей можно плюнуть на это и не освобождать память. Добавлено через 1 минуту Есть и менее экзотические примеры - броузеры, почтовые программы, текстовые редакторы. И прочее, прочее, прочее. Ты хочешь чтобы твой броузер через час работы пожирал 1Gb памяти ?
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
17.09.2009, 23:49 | 14 |
Это по закрытию процесса. А если это функция? в которой память выделили, поработали, кинули, потом еще пару сотен раз ее вызвали?
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
18.09.2009, 00:23 | 15 |
И так далее.
Вот именно, не поддерживается. Сами спрашиваете и тут же сами и отвечаете. Нужно 2 операции. Сперва регистр обнуляем, потом память. GAV_13, я что хочу сказать. Надо обнулять- обнуляй. Не надо- не обнуляй. Само не обнулится. Всё! ...Я вчера полночи изучал конструктор копирования и следил за переменными в отладчике. При возвращении фунцией значения ничто нигде не обнуляется, ещё раз повторю. Вот зачем программе (любой) чтобы в некоторой ячейке памяти был ноль (если она эту ячейку не задействует)? Низачем Если этой проге нужно что-то туда написать, она туда напишет. ноль там будет, два, три, пять- наважно. Программе всё равно. Она поверх этого значения напишет. А если некто пишет, например printf ("stroka"), то каждый уважающий себя программёр должен ЗНАТЬ, что шестой по счёту элемент будет обнулён и не говорить: "это сделано без моего ведома". Теперь: термин "уничтожение переменной". Он мне непонятен. Переменная характеризуется двумя сущностями- адресом и значением. Ну, можно за уши притянуть к этому термину. То есть обнуляется. Но адрес-то остаётся! Потому я его и не использую, он непонятно что значит. ...И в областях памяти для отработанных функций тоже будет мусор! Щас постараюсь прикрепить скриншот.
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
18.09.2009, 00:27 | 16 |
0
|
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
|
|
18.09.2009, 01:12 | 17 |
прочти следующее предложение, ведь не зря сказано слово "привычка". Я писал когда это просто жизненно неободимо.
это был риторический вопрос на самом деле. Не факт, что при следующем вызове переменные созданые внутри функции не запишутся в память, которую занимала эта же функция при прошлом вызове. В C# для этого реализован специальный механизм - "сборщик мусора", который периодически неявно вызывается и выгружает свободную память.
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
18.09.2009, 01:18 | 18 |
0
|
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
|
|
18.09.2009, 09:17 | 19 |
0
|
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
|
|
18.09.2009, 09:55 | 20 |
не для всех и не всегда... постоянно натыкаюсь на описание "Деструктор неявно не вызывается, программист должен сам позаботиться о вызове деструктора"
0
|
18.09.2009, 09:55 | |
18.09.2009, 09:55 | |
Помогаю со студенческими работами здесь
20
Два вопроса Два вопроса !!! Два вопроса. Два вопроса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |