![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Mormishka |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 236 Регистрация: 25.8.2010 Репутация: нет Всего: нет |
Как влияет на производительность передаю ли я по указателю или по параметру переменную в функцию?
Если я передаю по параметру процессор создает новую переменную и копирует в нее значание, а потом удаляет. В случае с указатетем по * или & я работаю только лишь с указателем. Тогда получается для высокой производительности нужно всегда передавать по указаетлю или по ссылке? |
|||
|
||||
| borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
смотря какой тип переменной. если простой, встроенный (double, int и т.п.), то разницы нет. Если это структура из двух полей (например width и height), то разница есть, но настолько мизерная, что ты её не ощутишь. Если же это какой-то здоровый навороченный класс с десятками полей, некоторые из которых являются в свою очередь классами, то, ессно, "выгоднее" передавать такую переменную по ссылке.
Сильно зависит от ситуации, а также от реализации классов, с которыми работаешь. Ситуация:
если в ф-ции sendDrawDataToAnotherThread указатель на SomeDataToDraw передаётся в другой поток, то этот (другой) поток получит указатель на уже разрушенную область памяти, т.к. drawData был создан на стеке. В данном случае (создание объекта на стеке) просто необходимо передавать копию этого объекта. Я для себя, например, установил следующее правило: работая в одном потоке передавать только константные ссылки на объекты (за исключением случаев, когда объект нужно заполнить - тогда неконстантная ссылка). Если же данные передаются между потоками, то чёткого правила нет, т.к. в одном случае есть смысл передавать копию, в другом - указатель на объект, созданный в куче через new, в третьем - shared_pointer... но в любом случае не ссылку. P.S. Преждевременная оптимизация - источник зла (С) Александреску, кажется. Прежде чем думать о производительности программы, IMHO нужно озаботиться 1. Грамотностью её архитектуры 2. Написанием понятного и простого кода 3. Отладкой, выявлением ошибок и всех подводных камней 4. Созданием документации по программе а вот затем уже и производительностью ( в версии 2.0 Обратил внимание, что производители браузеров примерно так и делают. В каждой новой версии они работают всё быстрее и быстрее, а архитектура практически не меняется. Там не дураки работают.... (Ишак не в счёт) Это сообщение отредактировал(а) borisbn - 2.4.2011, 11:00 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
| alexvs11 |
|
||||||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
на стеке создается новая переменная, в нее копируется значение, по выходу она освобождается
очевидно, что в этом случае на стеке создается указатель
классы и структуры - да а вот для встроенных типов скорее не надо во-первых выигрыша не будет (указатель все-равно копируется) во-вторых логика усложнится Это сообщение отредактировал(а) alexvs11 - 2.4.2011, 11:28 |
||||||
|
|||||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
для простых типов (особенно int) лучше по значению.. Добавлено через 49 секунд
|
||||
|
|||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
boostcoder, зачем писать f( const int& value ), когда можно написать f( int value ) и не боятся, что кто-нибудь сделает ((int&)value) = 100 таки изменив значение переменной
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
alexvs11, ну а логика тут при чем?
Добавлено через 12 секунд или о какой вы логике говорите? |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
||||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
поведения кого, программиста? аргумента? программиста с раздвоением личности? если вы пишите: а говорилось о аргументе - значит получается так, что изменить могут из тела функции? тогда еще больше непоняток... тело функции реализует не тот программист который декларировал функцию? или у него реально раздвоение личности? иначе не объяснить такое желание чудеса да и только.. |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Совершенно не обязательно тот же. Я, например, довольно часто пишу декларации абстрактных интерфейсов, а их реализацией занимаются другие Это сообщение отредактировал(а) borisbn - 2.4.2011, 14:03 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
где я это сказал ? откуда Вы это взяли ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
это следует из вашего ответа. если аргумент - константная ссылка, а реализатору нужно изменить значение на которое она указывает, значит, интерфейс спроектирован неправильно...значит его нужно изменить... Добавлено через 12 минут и 54 секунды и называется ли интерфейс после этого интерфейсом, в его стандартном понятии? уточню: вот вы задекларили интерфейс. передали его робокодерам. робокодеры, мыслят блоками кода, а не архитектурными концептами, потому как вторые, им попросту не известны. так вот.. некий робокодер, реализуя ваш интерфейс, решает, внезапно, изменить то, на что указывает аргумент константная ссылка. а вам не кажется, что у робокодера недостаточно информации для принятия такого решения? мне кажется он либо изменит интерфейс(что вдвойне крайне мало вероятно), либо обратится к проектировщику. ээээ... мне даже представить такое в реале не удается... Это сообщение отредактировал(а) boostcoder - 2.4.2011, 14:10 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
В идеале, да. Но бываю разные личности. Причем, чем одиознее мозк, тем выше самомнение. Конечно, старший должен учитывать специфику своих подчиненных, но не всегда за всем уследишь. Да и возможный полет мыслей, действительно, представить себе сложно. Так что все должно быть настолько просто, насколько возможно (не противореча назначению, семантике и производительности). В этом смысле int проще чем const int&. А это тебе сильно повезло, пока. Думаю, еще насмотришься, какие твои годы. -------------------- ... |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
речь шла о передачи по указателю (не по ссылке).. Добавлено через 1 минуту и 3 секунды насчет константой ссылки для просты типов , так она просто длиннее по буквам.. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |