Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мнение по указателям в рамках отдельных процедур, ИМХО на всю тему... просто мысли вслух 
:(
    Опции темы
En_t_end
Дата 22.6.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Вот внезапно в голову забралась мысль smile Ведь используя в функциях указатели, мы тем самым обрекаем на практически вечное существование стеки этих функций... То есть был к примеру указатель temp, указывающий на переменную типа int, обьявленную в этой функции. По идее когда процедура заканчивается, все переменные вместе со стеком уничтожаются, память отчищается. Но... если мы возвратим наш указатель в этой функции, то та переменная int, на которую сначала ссылался temp, а потом и какой-то другой указатель в другой процедуре будет жить, будет жить и стек. Теперь представим что функций 1000-и и каждые возвращают указатели char*. Хмм... что-то мне говорит, что такое использование указателей - это зло... потому что программа использует по сути ненужные стеки, на поддержание которых, вернее для работы с которыми тратиться лишняя память и процессорное время. В рамках простенького проекта это скорее не почувствовать, а точнее даже можно ощутить прирост производительности по сравнению с кустарным способ возвращения значения функции за счет существования меньшего числа потенциальных переменных, но в крупных программах я думаю есть шанс напороться на "обратную тягу".

PM MAIL ICQ Skype GTalk Jabber   Вверх
Дрон
Дата 22.6.2005, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(En_t_end @ 22.6.2005, 18:21)
будет жить и стек

Не будет smile


--------------------
Да. Именно так.
PM   Вверх
En_t_end
Дата 22.6.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Дрон 
Чем докажешь ?
PM MAIL ICQ Skype GTalk Jabber   Вверх
Дрон
Дата 22.6.2005, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



С++ это не Java и не C#. Он ссылки на объекты не контролирует.


--------------------
Да. Именно так.
PM   Вверх
En_t_end
Дата 22.6.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Дрон
Я говорю про контроль НЕ ссылок, а переменных... они в таких точно не уничтожаются. Сам попробуй.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Дрон
Дата 22.6.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Цитата(En_t_end @ 22.6.2005, 18:28)
. они в таких точно не уничтожаются. Сам попробуй.

Что значит не уничтожается?

Память освобождается и некоторое время будет ещё хранить значения, пока её какая-нибудь функция не перезапишет.


--------------------
Да. Именно так.
PM   Вверх
_hunter
Дата 22.6.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



если ты возвращаеш char* то где-то ( пусть в функции ) был new. вот эта _память_ и висит, но висит она не на стеке. а сам указатель возвращается по значению ( т.е. т он не висит... )


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
En_t_end
Дата 22.6.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



Дрон
стек простейшего метода chat* tempo(void); - будет существовать, как мне кажется до тех пор, пока эта ссылка не будет обнулена: char *tempo_ptr = tempo(void); Согласен ?
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mayk
Дата 22.6.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



En_t_End, проверь
Код

int* a()
{
    int tmp;
    static int counter=0;
    tmp=counter++;
    return &tmp;
}

int main()
{
   int *x,*y,*z;
   x=a(); y=a(); z=a();
   printf("%d %d %d\n",*x,*y,*z);
}


Следуя твоей логики должно быть выведено 0 1 2.
Следуя логики Си это совсем не так.


Добавлено @ 17:34
En_t_End
У функций НЕТ стека.
Стек один.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
En_t_end
Дата 22.6.2005, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



_hunter 
С new - это другой случай... там Си работает с динамической памятью - поэтому по сути указатель указыват на некоторую область памяти, причем стек функции не будет управлять ею. ИМХО
Добавлено @ 17:40
Mayk
Не понял... как это ? А как же вся та инфа, из которой я понял, что функция или процедура - это мини программа, соответсвенно... стек должен быть, как тогда реализовано управление переменными ? То что есть глобальный стек я не оспариваю.
Добавлено @ 17:41
Дрон
Бьярн Страуструп по моему писал, что ни одна переменная не будет уничтожена, пока на неё будет ссылаться указатель.
PM MAIL ICQ Skype GTalk Jabber   Вверх
comcon1
Дата 22.6.2005, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Посмотрим в ассемблер. Когда возвращается указатель перед вызовом функции стек смещается:

stack:.......................................перед вызовом:...........................................после call (вызов функции)
o|o|o|o|o|*........----->......... o|o|o|o|o|_memory_for pointer_| ---->...o|o|o|o|o|_memory_for_pointer_|_back_address_

далее в то место, где _memory_for_pointer_, записывается указатель. Мы выходим из функции:

команда ret Поп-ает адресс возврата. и смещает туда каретку...теперь мы делаем Pop и забираем результат.
o|o|o|o|o|_memory_for_pointer_.......................................------>.................................o|o|o|o|o|

Стек снова в исходном состоянии!!

Если хотите, можно подробнее. Но разницы в том, что возвращать, нет. Тока память разная в стеке отводится перед вызовом call

Это сообщение отредактировал(а) comcon1 - 22.6.2005, 17:48


--------------------
PM MAIL   Вверх
_hunter
Дата 22.6.2005, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



тогда я не понял что ты возвращаеш в своем указателе ( если ты под него память не выделяеш )...
но даже в таком случае вернется 4байта по значению и стек благополучно хрохнется


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
En_t_end
Дата 22.6.2005, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: 1
Всего: 20



_hunter
Вот пример... ну не скажешь же ты, что потом юзая в классе то что получу в результате этой функции я буду юзать призрака ?
Код

char *CPFClientDlg::Test()
{
char moment[21];
while(/**/){/**/} //Заполняем массив.
char *testing = moment; 
    return testing;
}


Это сообщение отредактировал(а) En_t_end - 22.6.2005, 17:57
PM MAIL ICQ Skype GTalk Jabber   Вверх
comcon1
Дата 22.6.2005, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



Програма выполняется по мере считывания ее из памяти. Есть в регистрах процессора указатель на место, где мы считываем (кажется IP) Instruction Pointer.
Здесь дело в том, что в функцию мы входим (команда CALL). И в стек заносится аддресс IT того места, откуда мы прыгаем в функцию. Внутри функции мы производим некоторые операции и возвращаемся (команда RET). И ВЕРХУШЕЧНЫМ ЭЛЕМЕНТОМ ДОЛЖЕН БЫТЬ АДДРЕСС возврата в тело прораммы. Иначе будет RunTimeError.

Из-за этого в стеке сначала отводят память (смещая указатель на вершину, стек в процессоре в обр. направлении)
SUB SP, 04
SUB - вычесть.
SP - STACK POINTER.
А потом уже входим в функцию.
CALL 0AFFF (аддресс входа туда будет смещен IP)

Ну а когда мы вернулись - мы берем из стека значение и приводим его в исходное состояние. Никаких перегрузок.

Это сообщение отредактировал(а) comcon1 - 22.6.2005, 17:55


--------------------
PM MAIL   Вверх
_hunter
Дата 22.6.2005, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



не скажу
потому что ты явно выделил память ( и никто короме тебя ее удаялть не будет )
а вот если где-то перед юзанеем сделаеш delete[] ( причем не обязательно tempo ) то именно призрака ты и получиш...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0608 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.