1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
1

два мелких вопроса на счет переменных

17.09.2009, 22:08. Показов 1420. Ответов 19

Author24 — интернет-сервис помощи студентам
у меня возник такой вопрос: скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
А что если у меня глобальные переменные с большим местом?Тогда оперативка должна каждый раз так работать?Или я что то не знаю?

===========================

еще один вопрос на счет переменных,в кИр увидел такой код,коды то есть
C++
1
2
3
4
int main()
int char;
int x;
{...}
как это пнять?Что это такое и почему компилятор находит тут ошику?
буду рад ответам.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.09.2009, 22:08
Ответы с готовыми решениями:

3 мелких вопроса
1. Если в базовом классе объявлена переменная с каким-то именем, то в производных классах такого...

2 мелких вопроса по основам сетей
Всем привет! Я не сисадмин, а всего лишь эникейщик, поэтому не надо пинать меня если вопросы...

Два вопроса
1. На современных сайтах частенько присутствует неплохой эффект - текст или изображение внизу...

Два вопроса по IE:
Добрый день! Сталкивался ли кто-нибудь со следующими проблемами: 1. IE (v6.0 SP1) не хочет...

19
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 22:17 2
Цитата Сообщение от МедведЪ Посмотреть сообщение
скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
С помощью return ты передаешь управление вызвавшему процессу, а переменная х (как и y, z, и прочее что там было определено) уничтожается при выходе из области видимости (точнее, в случае main, при завершении процесса).
C++
1
return (x);
Возвращает вызвавшему процессу х, а не освобождает место

Возможно, имелось ввиду это:
C++
1
2
3
4
int char;
int x;
int main()
{...}
0
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
17.09.2009, 22:20  [ТС] 3
Цитата Сообщение от GAV_13 Посмотреть сообщение
Возвращает вызвавшему процессу х, а не освобождает место
значит сама по себе освобождается,спасибо

Цитата Сообщение от GAV_13 Посмотреть сообщение
Возможно, имелось ввиду это:
Код C++
1
2
3
4
int char;
int x;
int 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
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
17.09.2009, 22:30  [ТС] 5
Цитата Сообщение от kravam Посмотреть сообщение
Если ты их явно обнулишь, то они обнулятся, если нет, то нет.
то есть как обнулить?
так?
C++
1
int x=0;
?
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 22:38 6
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Цитата Сообщение от kravam Посмотреть сообщение
Просто напросто прога не будет больше обращаться к этой ячейке и всё.
Очищать имеет смысл только структуры данных (классы, динамические массивы)
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.09.2009, 23:03 7
Цитата Сообщение от GAV_13 Посмотреть сообщение
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Нет, не бессмысленно.
Короче, медвед, скачивай отладчик и смотри. И помни само собой ничего не обнуляется. В том смысле, чтобы занести в ячейку 402000 некоторые данные, (обнулить, доопустим) процессор должен выполнить такие команды.

MOV EAX, 0
MOV DWORD PTR DS:[402000],EAX

Что они значат, пока неважно. Но они ДОЛЖНЫ быть выполнены.
Теперь смотри. Ты обнулял? Нет. Откуда им взяться в коде процессора?

Операционной системе нет дела до того, что творится в адресном пространстве твоей программы. Она не вмешивается сюда.
Штука, называемая средой программмирования, в принципе может так сделать-сделать исходый код, что обнуление будет присутвтвовать автоматом. Но зачем опять же? Что бы ты подольше сидел курил, когда у тебя рекурсия выполняется?
Если проге необходимо занести данные в ячейку памяти, то на возможнсоть это сделать содержание ячейки не влияет абсолютно.

Скачивай отладчик и смотри.
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 23:09 8
kravam,
Цитата Сообщение от kravam Посмотреть сообщение
Нет, не бессмысленно.
а в чем смысл? что-то не догоняю...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.09.2009, 23:15 9
Цитата Сообщение от GAV_13 Посмотреть сообщение
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Имелось ввиду- какой смысл присваивать переменой x значение 0, если оно (см. цитату выше). И так будет нулём.

Я сказал, что нулём оно не будет. Надо тебе обнулять- обнуляй руками.

...Только щас задумался- а каким образом?
Ну, вышли мы из функции. Ну, надо нам, допустим обнулить ту ячейку памяти, которая в ОТРАБОТАВШЕЙ функции задействована?
Не вижу я способов. Не задумывался я над ними. Не было необходимости.
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 23:23 10
Цитата Сообщение от kravam Посмотреть сообщение
Ну, надо нам, допустим обнулить ту ячейку памяти, которая в ОТРАБОТАВШЕЙ функции задействована?
ну, обнулить можно и перед выходом... только ЗАЧЕМ? Я считаю это бессмысленным, (а вы говорите что не бессмысленно) потому как это простая переменная, и уничтожиться она сама, (в том смысле что не будет утечки памяти)... это же не класс какой-нибудь, который резервирует память и если его не очистить он не отдасть зарезервированную под его хранение память...

Добавлено через 28 секунд
PS кажется, мы друг друга не поняли
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
17.09.2009, 23:41 11
А что глобальные? Если ты их явно обнулишь, то они обнулятся, если нет, то нет.
Тут ты путаешь.
Если ты глобальной переменной типа int ты ничего не присваивал - но ее значение все равно будет 0.

Добавлено через 1 минуту
как это пнять?Что это такое и почему компилятор находит тут ошику?
Это какая-то кривая ерунда - забудь про нее.

Добавлено через 2 минуты
скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
Не совсем так. Просто указатель стека сдвинется и как бы освободит место.
А что если у меня глобальные переменные с большим местом?Тогда оперативка должна каждый раз так работать?Или я что то не знаю?
Если у тебя глобальная переменная ссылается на какую-то область памяти в куче, то ты ее должен освободить явно до выхода из программы.
1
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
17.09.2009, 23:42 12
Цитата Сообщение от kravam Посмотреть сообщение
MOV EAX, 0
MOV DWORD PTR DS:[402000],EAX
это значит, что сначала в регистр eax заносим нужное нам значение, а потом записываем значение eax в указатель. Почему нельзя просто?
Assembler
1
MOV DWORD PTR DS:[402000],0
Такая схема записи не поддерживается.

Не важно, что хранится по адресу - переменная, обьект(ну нету такого понятия как класс по отношению к памяти, есть только обьекты), массив, 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
Цитата Сообщение от M128K145 Посмотреть сообщение
все равно по закрытию процесса все ресурсы выделенные потоку(потокам) этого процесса буду помечены как свободные для записи и там будет тот мусор, которые вы можете наблюдать когда вылезете за пределы выделеной вам памяти
Это по закрытию процесса. А если это функция? в которой память выделили, поработали, кинули, потом еще пару сотен раз ее вызвали?
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
18.09.2009, 00:23 15
Цитата Сообщение от M128K145 Посмотреть сообщение
это значит, что сначала в регистр eax заносим нужное нам значение, а потом записываем значение eax в указатель. Почему нельзя просто?
И так далее.
Вот именно, не поддерживается. Сами спрашиваете и тут же сами и отвечаете.

Нужно 2 операции.
Сперва регистр обнуляем, потом память.

GAV_13, я что хочу сказать.
Надо обнулять- обнуляй. Не надо- не обнуляй. Само не обнулится.
Всё!

...Я вчера полночи изучал конструктор копирования и следил за переменными в отладчике. При возвращении фунцией значения ничто нигде не обнуляется, ещё раз повторю.

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

А если некто пишет, например printf ("stroka"), то каждый уважающий себя программёр должен ЗНАТЬ, что шестой по счёту элемент будет обнулён и не говорить: "это сделано без моего ведома".

Теперь: термин "уничтожение переменной".
Он мне непонятен.
Переменная характеризуется двумя сущностями- адресом и значением.

Ну, можно за уши притянуть к этому термину.
То есть обнуляется. Но адрес-то остаётся!
Потому я его и не использую, он непонятно что значит.

...И в областях памяти для отработанных функций тоже будет мусор! Щас постараюсь прикрепить скриншот.
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
18.09.2009, 00:27 16
Цитата Сообщение от kravam Посмотреть сообщение
Теперь: термин "уничтожение переменной".
Если это ко мне, то я имел ввиду перестать резервировать энто место в памяти.
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
18.09.2009, 01:12 17
Цитата Сообщение от odip Посмотреть сообщение
Ты хочешь чтобы твой броузер через час работы пожирал 1Gb памяти ?
прочти следующее предложение, ведь не зря сказано слово "привычка". Я писал когда это просто жизненно неободимо.
Цитата Сообщение от kravam Посмотреть сообщение
Сами спрашиваете и тут же сами и отвечаете.
это был риторический вопрос на самом деле.
Цитата Сообщение от GAV_13 Посмотреть сообщение
память выделили, поработали, кинули, потом еще пару сотен раз ее вызвали
Не факт, что при следующем вызове переменные созданые внутри функции не запишутся в память, которую занимала эта же функция при прошлом вызове. В C# для этого реализован специальный механизм - "сборщик мусора", который периодически неявно вызывается и выгружает свободную память.
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
18.09.2009, 01:18 18
Цитата Сообщение от M128K145 Посмотреть сообщение
Не факт, что при следующем вызове переменные созданые внутри функции не запишутся в память, которую занимала эта же функция при прошлом вызове
верно. Если был вызван деструктор. а если "забыли"?
0
Эксперт JavaЭксперт С++
8384 / 3616 / 419
Регистрация: 03.07.2009
Сообщений: 10,709
18.09.2009, 09:17 19
Цитата Сообщение от GAV_13 Посмотреть сообщение
а если "забыли"
то он вызовется неявно
0
81 / 81 / 6
Регистрация: 14.09.2009
Сообщений: 252
18.09.2009, 09:55 20
Цитата Сообщение от M128K145 Посмотреть сообщение
то он вызовется неявно
не для всех и не всегда... постоянно натыкаюсь на описание "Деструктор неявно не вызывается, программист должен сам позаботиться о вызове деструктора"
0
18.09.2009, 09:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2009, 09:55
Помогаю со студенческими работами здесь

Два вопроса
1) Можно ли в тексте запроса указывать номера выводимых полей а не их имен?, а то полей много и...

Два вопроса !!!
1. Можно ли в А2000 в запросах использовать функции с русским названием? У меня не видит этих...

Два вопроса.
-Можно ли работать с SAX на C#. -КАк можно получать информацию с СОМ порта тоже соответственно с...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru