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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передать в функцию char*, в качестве модифицируемого параметра 
:(
    Опции темы
Daevaorn
Дата 19.5.2006, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Romikgy @  19.5.2006,  09:27 Найти цитируемый пост)
Ведь всеравно , что внутри менялось в наружу не выдет? зачем надо было так извращатся то?  

Для самоконтроля программиста. Чтобы ненароком не записать в эту переменную что-либо. Но по сути, пользы от этого мало. 
PM MAIL WWW   Вверх
Romikgy
Дата 19.5.2006, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Я смотрю в С много чего есть , правда пользы от него маловато, зато когда начинаешь об этом читать, голова может сварится smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
likehood
Дата 19.5.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


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

Репутация: 8
Всего: 24





Цитата(Daevaorn @  19.5.2006,  10:05 Найти цитируемый пост)
Для самоконтроля программиста. Чтобы ненароком не записать в эту переменную что-либо. Но по сути, пользы от этого мало.

Польза все же есть, вот пример:
Код

#include <stdio.h>

void func(const char *s) {
    s[0] = 'B';
}

void main() {
    char s[] = "Test string";
    func(s);
    puts(s);
}


Если оставить все как есть, получим ошибку компиляции: нельзя изменить значение по указателю s в функции func. Если же const убрать, получим Best string. 
PM MAIL   Вверх
Fazil6
Дата 19.5.2006, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

Для самоконтроля программиста. Чтобы ненароком не записать в эту переменную что-либо. Но по сути, пользы от этого мало. 

Цитата

Я смотрю в С много чего есть , правда пользы от него маловато, зато когда начинаешь об этом читать, голова может сварится

не все так просто и очевидно. 
Ты написал функцию 
int fffff(char* s);

теперь я пишу программу и применяю твою функцию. Я знаю, что часто указатель передается в функцию для того, чтобы туда был записан результат. Я не знаю как и что делает эта ф-я и я не знаю что будет лежать по этому указателю после вызова этой функции.
А вот если ты напишешь функцию
int fffff(const char* s);
у меня никаких сомнений нет по поводу того зачем передается указатель. Тоже самое относится и к аргументам  ссылкам.

 
PM MAIL   Вверх
Romikgy
Дата 19.5.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Fazil6 @  19.5.2006,  09:41 Найти цитируемый пост)
у меня никаких сомнений нет по поводу того зачем передается указатель

И зачем? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fazil6
Дата 19.5.2006, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

И зачем?

затем, что это аргумент для функции, а не буфер для результата. Затем, что передача ссылки(указателя) намного эфективнее чем передача значения при передаче классов/структур и классы обычно так и передаются 
PM MAIL   Вверх
Romikgy
Дата 19.5.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Romikgy @  19.5.2006,  09:55 Найти цитируемый пост)
Цитата(Fazil6 @  19.5.2006,  09:41 )у меня никаких сомнений нет по поводу того зачем передается указатель

это с 
Цитата(Fazil6 @  19.5.2006,  10:06 Найти цитируемый пост)
затем, что это аргумент для функции, а не буфер для результата

этим как то не соотносятся smile
Цитата(Fazil6 @  19.5.2006,  10:06 Найти цитируемый пост)
намного эфективнее чем передача значения

в чем эффективнее? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Fazil6
Дата 19.5.2006, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



хорошо. Начнем с конца.
Цитата

в чем эффективнее? 

допустим нам в функцию надо передать std::string
можно так
void fun(std::string str)
а можно и так
void fun(std::string* str)
результат будет одинаковый и в первом и во втором случае внутри функции мы получим необходимую строку, но в первом случае будет создан еще один объект, в этот объект будут копироваться все значения полей (все, что определено в конструкторе копии), а во втором будет передано значение адреса и все. Вызов второго варианта намного быстрее.
Цитата

этим как то не соотносятся 

прекрасно соотносится. В нашем 2-м варианте я не могу знать зачем передается указатель просто из соображений эфективности или для того, чтобы записать что-то по этому адресу, а если будет стоять const, то это значит, что функция говорит, что она не собирается изменять содержимое по этому адресу и буфером для результата это не является 
PM MAIL   Вверх
Любитель
Дата 19.5.2006, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Функции вида void func(const int a) действительно бессмысленны. const нужно для ссылок и указателей, чтобы гарантировать, что мы с помощью этой ссылки или указателя не изменим значение.
НО для указателя - указываемое значение, а не значение самого указтеля. 


--------------------
PM MAIL ICQ Skype   Вверх
Romikgy
Дата 19.5.2006, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Fazil6 @  19.5.2006,  11:43 Найти цитируемый пост)
допустим нам в функцию надо передать std::stringможно такvoid fun(std::string str)а можно и такvoid fun(std::string* str)результат будет одинаковый и в первом и во втором случае внутри функции мы получим необходимую строку, но в первом случае будет создан еще один объект, в этот объект будут копироваться все значения полей (все, что определено в конструкторе копии), а во втором будет передано значение адреса и все. Вызов второго варианта намного быстрее.

Окей здесь вышло недопонимание терминов, об этом я знал давно
Цитата(Fazil6 @  19.5.2006,  11:43 Найти цитируемый пост)
прекрасно соотносится. В нашем 2-м варианте я не могу знать зачем передается указатель просто из соображений эфективности или для того, чтобы записать что-то по этому адресу, а если будет стоять const, то это значит, что функция говорит, что она не собирается изменять содержимое по этому адресу и буфером для результата это не является 

А с этим как то не совсем соглашусь, ты когда нибудь смотрел ассемблер код такой функции с const и без оной?
Посмотри ... он ничем не отличается smile, т.е. др. словами машиному коду все равно , в стеке остается результат, а вот компилятор (как я понял) за этим следит и выдает пердупреждения. 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Earnest
Дата 19.5.2006, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Именно это Fazil6 и говорит. const практически не влияет на сгенерированный код, это подсказка для программиста и компилятора.  


--------------------
...
PM   Вверх
Fazil6
Дата 19.5.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

А с этим как то не совсем соглашусь, ты когда нибудь смотрел ассемблер код такой функции с const и без оной?
Посмотри ... он ничем не отличается 

я и не заявляю, что const влияет на эфективность. я говорю совершенно о другом. если аргументом функции является const std::string*, то я понимаю, что указатель передается только  для того, чтобы не передавать сам объект по значению и данные менять не собираются, а если const не указан, то я буду предполагать, что внутри этой функции этот объект будут изменять и после вызова функции моя строка вполне возможно будет изменена.  Т.е. в случае когда в аргументах функции встречается указатель на константу, то компилятору это значит "нельзя менять содержимое", а для программиста вызывающего эту функцию это говорит: "содержимое не будет меняться" 
PM MAIL   Вверх
GremlinProg
Дата 19.5.2006, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



Romikgy, раз уж ты о ассемблере заговорил, то наверняка понимаешь, что такое вызов cdecl. При очень плотной оптимизации, значения параметров с модификатором const могут не сохраняться дополнительно в стеке, а использоваться уже в другой функции. А теперь подумай, что будет, если ты вот такой параметр изменил: следующая по коду функция примет как будто тот же параметр, но на самом деле он будет изменен предыдущим вызовом. Это единственный случай, когда нужно помнить о const в параметрах типа void foo(int c). Остальное уже все рассказали, повторяться не буду. 

PS: оптимизация в сторону скорости работает по такому принципу только если ты ставишь const, в остальных случаях, все необходимые параметры сохраняются в стеке отдельно. Поэтому не пытайтесь изголяться с преобразованиями типа *(TYPE*)&c, где c - константа, ни к чему хорошему это не приведет, особенно, если вы таки используете оптимизацию компилятора. Подробно по всем опциям оптимизации написано в MSDN'е. 

Это сообщение отредактировал(а) GremlinProg - 19.5.2006, 14:11


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Romikgy
Дата 19.5.2006, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(GremlinProg @  19.5.2006,  13:00 Найти цитируемый пост)
 то наверняка понимаешь, что такое вызов cdecl

Если честно то не сильно , я просто взял две фунции и посмотрел что получается на выходе.

Цитата(GremlinProg @  19.5.2006,  13:00 Найти цитируемый пост)
значения параметров с модификатором const могут не сохраняться дополнительно в стеке, а использоваться уже в другой функции

не понял?

Добавлено @ 15:17 
Цитата(Earnest @  19.5.2006,  12:38 Найти цитируемый пост)
 const 


Цитата(Earnest @  19.5.2006,  12:38 Найти цитируемый пост)
это подсказка для программиста и компилятора.  

Все более к этому склоняюсь

Цитата(Earnest @  19.5.2006,  12:38 Найти цитируемый пост)
 const практически не влияет

здесь можно по подробнее , на что влияет и когда? 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
GremlinProg
Дата 19.5.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



cdecl - то вызов функции с передачей параметров в стеке. Вызывающий оператор сам очищает стек после вызова, поэтому параметры, которые он передаёт функции он может использовать повторно. Это одно из преимуществ, которое и породило thiscall.
Цитата

значения параметров с модификатором const могут не сохраняться дополнительно в стеке

Под этим я и подразумевал:
Цитата

параметры, которые он передаёт функции он может использовать повторно
 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW 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.0626 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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