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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача по указателю, производительность 
:(
    Опции темы
Mormishka
Дата 2.4.2011, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Как влияет на производительность передаю ли я по указателю или по параметру переменную в функцию?
Если я передаю по параметру процессор создает новую переменную и копирует в нее значание, а потом удаляет. 
В случае с указатетем по * или & я работаю только лишь с указателем.

Тогда получается для высокой производительности нужно всегда передавать по указаетлю или по ссылке?
PM MAIL   Вверх
borisbn
Дата 2.4.2011, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Mormishka @  2.4.2011,  08:53 Найти цитируемый пост)
Как влияет на производительность передаю ли я по указателю или по параметру переменную в функцию?

смотря какой тип переменной. если простой, встроенный (double, int и т.п.), то разницы нет. Если это структура из двух полей (например width и height), то разница есть, но настолько мизерная, что ты её не ощутишь. Если же это какой-то здоровый навороченный класс с десятками полей, некоторые из которых являются в свою очередь классами, то, ессно, "выгоднее" передавать такую переменную по ссылке.

Цитата(Mormishka @  2.4.2011,  08:53 Найти цитируемый пост)
Тогда получается для высокой производительности нужно всегда передавать по указаетлю или по ссылке?

Сильно зависит от ситуации, а также от реализации классов, с которыми работаешь.
Ситуация:
Код

void ThreadingClass::run() {
    if ( do_draw )
    {
        SomeDataToDraw drawData;
        ...
        sendDrawDataToAnotherThread( &drawData );
    }
}

если в ф-ции sendDrawDataToAnotherThread указатель на SomeDataToDraw передаётся в другой поток, то этот (другой) поток получит указатель на уже разрушенную область памяти, т.к. drawData был создан на стеке.
В данном случае (создание объекта на стеке) просто необходимо передавать копию этого объекта.

Я для себя, например, установил следующее правило: работая в одном потоке передавать только константные ссылки на объекты (за исключением случаев, когда объект нужно заполнить - тогда неконстантная ссылка). Если же данные передаются между потоками, то чёткого правила нет, т.к. в одном случае есть смысл передавать копию, в другом - указатель на объект, созданный в куче через new, в третьем - shared_pointer... но в любом случае не ссылку.

P.S. Преждевременная оптимизация - источник зла (С) Александреску, кажется.
Прежде чем думать о производительности программы, IMHO нужно озаботиться
1. Грамотностью её архитектуры
2. Написанием понятного и простого кода
3. Отладкой, выявлением ошибок и всех подводных камней
4. Созданием документации по программе

а вот затем уже и производительностью ( в версии 2.0 smile )

Обратил внимание, что производители браузеров примерно так и делают. В каждой новой версии они работают всё быстрее и быстрее, а архитектура практически не меняется. Там не дураки работают.... (Ишак не в счёт)

Это сообщение отредактировал(а) borisbn - 2.4.2011, 11:00


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
alexvs11
Дата 2.4.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(Mormishka @  2.4.2011,  08:53 Найти цитируемый пост)
Если я передаю по параметру процессор создает новую переменную и копирует в нее значание, а потом удаляет. 

на стеке создается новая переменная, в нее копируется значение, по выходу она освобождается

Цитата(Mormishka @  2.4.2011,  08:53 Найти цитируемый пост)
В случае с указатетем по * или & я работаю только лишь с указателем.

очевидно, что в этом случае на стеке создается указатель

Цитата(Mormishka @  2.4.2011,  08:53 Найти цитируемый пост)
Тогда получается для высокой производительности нужно всегда передавать по указаетлю или по ссылке?

классы и структуры - да
а вот для встроенных типов скорее не надо
во-первых выигрыша не будет (указатель все-равно копируется)
во-вторых логика усложнится

Это сообщение отредактировал(а) alexvs11 - 2.4.2011, 11:28
PM MAIL   Вверх
mes
Дата 2.4.2011, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(borisbn @  2.4.2011,  09:56 Найти цитируемый пост)
смотря какой тип переменной. если простой, встроенный (double, int и т.п.), то разницы нет

для простых типов (особенно int) лучше по значению..

Добавлено через 49 секунд
Цитата(alexvs11 @  2.4.2011,  10:27 Найти цитируемый пост)
во-первых выигрыша не будет (указатель все-равно копируется)
во-вторых логика усложнится 

 smile 


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 2.4.2011, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(alexvs11 @  2.4.2011,  11:27 Найти цитируемый пост)
во-вторых логика усложнится

поясните.. smile 
PM WWW   Вверх
alexvs11
Дата 2.4.2011, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



boostcoder, зачем писать f( const int& value ), когда можно написать f( int value ) и не боятся, что кто-нибудь сделает ((int&)value) = 100 таки изменив значение переменной
PM MAIL   Вверх
boostcoder
Дата 2.4.2011, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



alexvs11, ну а логика тут при чем?

Добавлено через 12 секунд
или о какой вы логике говорите?
PM WWW   Вверх
alexvs11
Дата 2.4.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



объявление параметра функции определяет логику работы с ним, логику его поведения
Цитата(boostcoder @  2.4.2011,  13:39 Найти цитируемый пост)
или о какой вы логике говорите?

под логикой понимаю специфицированное поведения
PM MAIL   Вверх
boostcoder
Дата 2.4.2011, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(alexvs11 @  2.4.2011,  13:51 Найти цитируемый пост)
объявление параметра функции определяет логику работы с ним, логику его поведения

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

если вы пишите:
Цитата(alexvs11 @  2.4.2011,  13:31 Найти цитируемый пост)
и не боятся, что кто-нибудь сделает ((int&)value) = 100

а говорилось о аргументе - значит получается так, что изменить могут из тела функции? тогда еще больше непоняток... тело функции реализует не тот программист который декларировал функцию? или у него реально раздвоение личности? иначе не объяснить такое желание smile 

чудеса да и только..
PM WWW   Вверх
borisbn
Дата 2.4.2011, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(boostcoder @  2.4.2011,  13:58 Найти цитируемый пост)
тело функции реализует не тот программист который декларировал функцию? 

Совершенно не обязательно тот же. Я, например, довольно часто пишу декларации абстрактных интерфейсов, а их реализацией занимаются другие

Это сообщение отредактировал(а) borisbn - 2.4.2011, 14:03


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 2.4.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(borisbn @  2.4.2011,  14:03 Найти цитируемый пост)
Я, например, довольно часто пишу декларации абстрактных интерфейсов, а их реализации делают другие

и они изменяют декларации? smile 
накой вы тогда их пишите так, что после вас все(всем?) приходится переписывать?
PM WWW   Вверх
borisbn
Дата 2.4.2011, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(boostcoder @  2.4.2011,  14:04 Найти цитируемый пост)
и они изменяют декларации?  

где я это сказал ? откуда Вы это взяли ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 2.4.2011, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 49
Всего: 110



Цитата(borisbn @  2.4.2011,  14:06 Найти цитируемый пост)
где я это сказал ? откуда Вы это взяли ? 

это следует из вашего ответа. если аргумент - константная ссылка, а реализатору нужно изменить значение на которое она указывает, значит, интерфейс спроектирован неправильно...значит его нужно изменить...

Добавлено через 12 минут и 54 секунды
Цитата(boostcoder @  2.4.2011,  14:09 Найти цитируемый пост)
значит его нужно изменить...

и называется ли интерфейс после этого интерфейсом, в его стандартном понятии?

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

ээээ... мне даже представить такое в реале не удается...

Это сообщение отредактировал(а) boostcoder - 2.4.2011, 14:10
PM WWW   Вверх
Earnest
Дата 2.4.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(boostcoder @  2.4.2011,  15:09 Найти цитируемый пост)
так вот.. некий робокодер, реализуя ваш интерфейс, решает, внезапно, изменить то, на что указывает аргумент константная ссылка. а вам не кажется, что у робокодера недостаточно информации для принятия такого решения? мне кажется он либо изменит интерфейс(что вдвойне крайне мало вероятно), либо обратится к проектировщику.

В идеале, да. Но бываю разные личности. Причем, чем одиознее мозк, тем выше самомнение. Конечно, старший должен учитывать специфику своих подчиненных, но не всегда за всем уследишь. Да и возможный полет мыслей, действительно, представить себе сложно. Так что все должно быть настолько просто, насколько возможно (не противореча назначению, семантике и производительности). В этом смысле int проще чем const int&.

Цитата(boostcoder @  2.4.2011,  15:09 Найти цитируемый пост)
ээээ... мне даже представить такое в реале не удается...

А это тебе сильно повезло, пока. Думаю, еще насмотришься, какие твои годы. smile 


--------------------
...
PM   Вверх
mes
Дата 2.4.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

Репутация: 144
Всего: 250



Цитата(boostcoder @  2.4.2011,  11:59 Найти цитируемый пост)
поясните.. 

речь шла о передачи по указателю (не по ссылке)..

Добавлено через 1 минуту и 3 секунды
насчет константой ссылки для просты типов , так она просто длиннее по буквам..
smile


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0932 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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