Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
#1

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

17.09.2009, 22:08. Просмотров 1092. Ответов 19

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

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

еще один вопрос на счет переменных,в кИр увидел такой код,коды то есть
C++
1
2
3
4
int main()
int char;
int x;
{...}
как это пнять?Что это такое и почему компилятор находит тут ошику?
буду рад ответам.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GAV_13
81 / 81 / 4
Регистрация: 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()
{...}
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
17.09.2009, 22:20  [ТС]     два мелких вопроса на счет переменных #3
Цитата Сообщение от GAV_13 Посмотреть сообщение
Возвращает вызвавшему процессу х, а не освобождает место
значит сама по себе освобождается,спасибо

Цитата Сообщение от GAV_13 Посмотреть сообщение
Возможно, имелось ввиду это:
Код C++
1
2
3
4
int char;
int x;
int main()
{...}
нет
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
17.09.2009, 22:23     два мелких вопроса на счет переменных #4
Ответ на первый вопрос.
Значит, при возвращении ты НЕ обнуляешь ячейку памяти, где хранилось значение переменной x

То есть если в функции под переменную int x= 1234 была отведена ячейка, допустим, с номером
0X22ffee. И пусть функция x возвращает эту переменную. Тогда

После такой записи
int d= f ();

В ячейке памяти, которая отведена под переменную d (допустим 0X224400) появится значение 1234.
И это же значение ОСТАНЕТСЯ в ячейке 0X22ffee

Просто напросто прога не будет больше обращаться к этой ячейке и всё.
Почему не обнуляет? Потому, что это лишние ресурсы. Можно просто не обращаться к этой области памяти и всё.
...А что глобальные? Если ты их явно обнулишь, то они обнулятся, если нет, то нет.

P.S. Медвед, скачай отладчик OllyDbg и своими глазами всё увидь.
^Tecktonik_KiLLeR
1158 / 440 / 22
Регистрация: 23.06.2009
Сообщений: 6,227
Завершенные тесты: 1
17.09.2009, 22:30  [ТС]     два мелких вопроса на счет переменных #5
Цитата Сообщение от kravam Посмотреть сообщение
Если ты их явно обнулишь, то они обнулятся, если нет, то нет.
то есть как обнулить?
так?
C++
1
int x=0;
?
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 22:38     два мелких вопроса на счет переменных #6
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Цитата Сообщение от kravam Посмотреть сообщение
Просто напросто прога не будет больше обращаться к этой ячейке и всё.
Очищать имеет смысл только структуры данных (классы, динамические массивы)
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
17.09.2009, 23:03     два мелких вопроса на счет переменных #7
Цитата Сообщение от GAV_13 Посмотреть сообщение
Так) Вот только по адресу где раньше хранилось 1234 теперь будет хранится 0 Так что это бессмысленно:
Нет, не бессмысленно.
Короче, медвед, скачивай отладчик и смотри. И помни само собой ничего не обнуляется. В том смысле, чтобы занести в ячейку 402000 некоторые данные, (обнулить, доопустим) процессор должен выполнить такие команды.

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

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

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

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

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

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

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

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

Добавлено через 2 минуты
скажем в функции main у меня есть переменная х, а с помощью return я освобождаю место,занятое х-ом.
Не совсем так. Просто указатель стека сдвинется и как бы освободит место.
А что если у меня глобальные переменные с большим местом?Тогда оперативка должна каждый раз так работать?Или я что то не знаю?
Если у тебя глобальная переменная ссылается на какую-то область памяти в куче, то ты ее должен освободить явно до выхода из программы.
M128K145
Эксперт С++
8282 / 3501 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
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 элементов делать это бессмысленно. Это имеет смысл тогда когда идут реально большие затраты ресурсов памяти, которые необходимо периодически освобождать, чтобы зря не загружать ОЗУ.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
17.09.2009, 23:47     два мелких вопроса на счет переменных #13
И поверьте, то что пишут в книгах типа "удаляйте динамически выделенную память под массивы" - это они вырабатывают в вас привычку это делать
И очень правильно делают !
А иначе ты будешь писать кривой КОД с утечками памяти !!!
И потом есть программы-серверы, которые сутками крутятся. Есть сами операционные системы - тоже сутками крутятся. Все нужно делать корректно.
Только для учебных целей можно плюнуть на это и не освобождать память.

Добавлено через 1 минуту
Есть и менее экзотические примеры - броузеры, почтовые программы, текстовые редакторы. И прочее, прочее, прочее.
Ты хочешь чтобы твой броузер через час работы пожирал 1Gb памяти ?
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
17.09.2009, 23:49     два мелких вопроса на счет переменных #14
Цитата Сообщение от M128K145 Посмотреть сообщение
все равно по закрытию процесса все ресурсы выделенные потоку(потокам) этого процесса буду помечены как свободные для записи и там будет тот мусор, которые вы можете наблюдать когда вылезете за пределы выделеной вам памяти
Это по закрытию процесса. А если это функция? в которой память выделили, поработали, кинули, потом еще пару сотен раз ее вызвали?
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
18.09.2009, 00:23     два мелких вопроса на счет переменных #15
Цитата Сообщение от M128K145 Посмотреть сообщение
это значит, что сначала в регистр eax заносим нужное нам значение, а потом записываем значение eax в указатель. Почему нельзя просто?
И так далее.
Вот именно, не поддерживается. Сами спрашиваете и тут же сами и отвечаете.

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

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

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

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

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

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

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

...И в областях памяти для отработанных функций тоже будет мусор! Щас постараюсь прикрепить скриншот.
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
18.09.2009, 00:27     два мелких вопроса на счет переменных #16
Цитата Сообщение от kravam Посмотреть сообщение
Теперь: термин "уничтожение переменной".
Если это ко мне, то я имел ввиду перестать резервировать энто место в памяти.
M128K145
Эксперт С++
8282 / 3501 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
18.09.2009, 01:12     два мелких вопроса на счет переменных #17
Цитата Сообщение от odip Посмотреть сообщение
Ты хочешь чтобы твой броузер через час работы пожирал 1Gb памяти ?
прочти следующее предложение, ведь не зря сказано слово "привычка". Я писал когда это просто жизненно неободимо.
Цитата Сообщение от kravam Посмотреть сообщение
Сами спрашиваете и тут же сами и отвечаете.
это был риторический вопрос на самом деле.
Цитата Сообщение от GAV_13 Посмотреть сообщение
память выделили, поработали, кинули, потом еще пару сотен раз ее вызвали
Не факт, что при следующем вызове переменные созданые внутри функции не запишутся в память, которую занимала эта же функция при прошлом вызове. В C# для этого реализован специальный механизм - "сборщик мусора", который периодически неявно вызывается и выгружает свободную память.
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
18.09.2009, 01:18     два мелких вопроса на счет переменных #18
Цитата Сообщение от M128K145 Посмотреть сообщение
Не факт, что при следующем вызове переменные созданые внутри функции не запишутся в память, которую занимала эта же функция при прошлом вызове
верно. Если был вызван деструктор. а если "забыли"?
M128K145
Эксперт С++
8282 / 3501 / 143
Регистрация: 03.07.2009
Сообщений: 10,707
18.09.2009, 09:17     два мелких вопроса на счет переменных #19
Цитата Сообщение от GAV_13 Посмотреть сообщение
а если "забыли"
то он вызовется неявно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2009, 09:55     два мелких вопроса на счет переменных
Еще ссылки по теме:

Два вопроса C++
C++ Два вопроса от новичка
ввести строку а с клавиатуры. вместо каждой точки поставить два знака вопроса. и подсчитать колличество слов в предложении C++
Реализация мелких функций в hpp C++
Правильно ли я делаю, что начинаю становления себя как программиста с решения мелких задач из интернета? C++

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

Или воспользуйтесь поиском по форуму:
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
18.09.2009, 09:55     два мелких вопроса на счет переменных #20
Цитата Сообщение от M128K145 Посмотреть сообщение
то он вызовется неявно
не для всех и не всегда... постоянно натыкаюсь на описание "Деструктор неявно не вызывается, программист должен сам позаботиться о вызове деструктора"
Yandex
Объявления
18.09.2009, 09:55     два мелких вопроса на счет переменных
Ответ Создать тему
Опции темы

Текущее время: 15:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru