func(int par) или func(int const& par)
От: Аноним  
Дата: 04.10.04 11:45
Оценка:
Есть две функции.
То что в теле функции написано — не учитывать. Там бред
1-ая:
unsigned Function(unsigned par)
{
  unsigned temp;
  temp=par;
  return temp;
}
2-ая:
unsigned Function(unsigned const& par)
{
  unsigned temp;
  temp=par;
  return temp;
}

Вызов какой функции быстрее?
В умных книгах пишут, что параметры в функцию лучше передавать типа unsigned const& par. Но ведь в данном случае оптимально: unsigned par. Или я не прав?
Re: func(int par) или func(int const& par)
От: Bell Россия  
Дата: 04.10.04 11:50
Оценка:
Здравствуйте, Аноним, Вы писали:

Как правило, встроенные типы эффективнее передавать по значению.
Любите книгу — источник знаний (с) М.Горький
Re[2]: func(int par) или func(int const& par)
От: Privalov  
Дата: 04.10.04 11:56
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>Как правило, встроенные типы эффективнее передавать по значению.


Возможно. Но при передаче double, наверное будет небольшой выигрыш при передаче по ссылке (4 байта вместо 8).
Re[3]: func(int par) или func(int const& par)
От: Bell Россия  
Дата: 04.10.04 12:23
Оценка:
Здравствуйте, Privalov, Вы писали:

P>Возможно. Но при передаче double, наверное будет небольшой выигрыш при передаче по ссылке (4 байта вместо 8).


Не знаю. Но boost::call_traits<T>::param_type для всех арифметических типов (к коим относится и double) представляется как T const.
Любите книгу — источник знаний (с) М.Горький
Re[3]: func(int par) или func(int const& par)
От: SWW Россия  
Дата: 04.10.04 12:34
Оценка:
B>>Как правило, встроенные типы эффективнее передавать по значению.

P>Возможно. Но при передаче double, наверное будет небольшой выигрыш при передаче по ссылке (4 байта вместо 8).


Переписываться они будут не побайтно, так что и здесь лучше по значению.
Re[3]: func(int par) или func(int const& par)
От: Аноним  
Дата: 04.10.04 12:38
Оценка:
Здравствуйте, Privalov, Вы писали:
P>Возможно. Но при передаче double, наверное будет небольшой выигрыш при передаче по ссылке (4 байта вместо 8).

Это еще вопрос. Вот, например, для VC7.0:

void test(double d){...};
void test2(double const& d){...};

...
test(1.1);
//004122DE  push        3FF19999h 
//004122E3  push        9999999Ah 
//004122E8  call        test (411857h) 

test2(1.2);
//004122F0  mov         dword ptr [ebp-0D0h],33333333h 
//004122FA  mov         dword ptr [ebp-0CCh],3FF33333h 
//00412304  lea         eax,[ebp-0D0h] 
//0041230A  push        eax

Что быстрее?

еще все сильно зависит от ситуации (например, если передавать глобальную переменную, то для не ссылки будет четыре операции работы с памятью, а для ссылки — всего одна).
Re: func(int par) или func(int const& par)
От: _Winnie Россия C++.freerun
Дата: 04.10.04 12:39
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть две функции.

А>
А>unsigned Function(unsigned par)
А>unsigned Function(unsigned const& par)
А>

А>Вызов какой функции быстрее?

Вызов одинаковый, кстати Вопрос о времени работы.

А>В умных книгах пишут, что параметры в функцию лучше передавать типа unsigned const& par. Но ведь в данном случае оптимально: unsigned par. Или я не прав?

Прав, прав.


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



если передавать по ссылке, то


    + снижаются затраты на копирование
    — компилятор обращается все время к переменной через указатель (можно победить при помощи ключевого слова restrict или #pragma ivdep в IC++. restrict есть и в C99)

если передавать по значению, то

    — снижаются затраты на копирование
    + компилятор обращается к копии переменной, которую может положить в регистр или вообще уничтожить каким-либо образом




Замечу, что в данном случае sizeof(ссылка) == sizeof(int), поэтому об оптимизации копирования речи не идет и лучше передать по значению.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: func(int par) или func(int const& par)
От: _Winnie Россия C++.freerun
Дата: 04.10.04 12:49
Оценка:
Так что все зависит от всего.
Если, скажем, фунkция работает в течение часа, то может оказаться, что передав туда слона std::map<std::string, std::string> MegaSlon программа начнет работать быстрее.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: func(int par) или func(int const& par)
От: Аноним  
Дата: 04.10.04 13:47
Оценка:
Здравствуйте, _Winnie, Вы писали:

unsigned Function(unsigned par)
unsigned Function(unsigned const& par)

А>>Вызов какой функции быстрее?

_W>Вызов одинаковый, кстати Вопрос о времени работы.


Да вроде правильно выразился:

unsigned Function(unsigned par)


; 78   : 
; 79   :   unsigned Res=Function(123);

  00140    6a 7b         push     123            ; 0000007bH
  00142    e8 00 00 00 00     call     ?Function@@YAII@Z    ; Function
  00147    83 c4 04     add     esp, 4
  0014a    89 45 e0     mov     DWORD PTR _Res$[ebp], eax

unsigned Function(unsigned const& par)

; 78   : 
; 79   :   unsigned Res=Function(123);

  00140    c7 45 c4 7b 00
    00 00         mov     DWORD PTR $T34965[ebp], 123 ; 0000007bH
  00147    8d 45 c4     lea     eax, DWORD PTR $T34965[ebp]
  0014a    50         push     eax
  0014b    e8 00 00 00 00     call     ?Function@@YAIABI@Z    ; Function
  00150    83 c4 04     add     esp, 4
  00153    89 45 e0     mov     DWORD PTR _Res$[ebp], eax

Во-втором случае на вызов, вроде, больше времени тратим.
Re[3]: func(int par) или func(int const& par)
От: _Winnie Россия C++.freerun
Дата: 04.10.04 13:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Во-втором случае на вызов, вроде, больше времени тратим.


Во-первых, почему времени? Больше инструкций еще не значит больше времени на современных процессорах. К тому же в release они, как-правило, так перемешаны, что трудно сказать, где начинается одна конструция С++, и начинается другая.

Во-вторых, ты случайно не в DebugMode компилировал? Если не принять специальных мер, то в Release компилиятор вообще уничтожит вызов этих функций.

В-третьих, ты передавал туда 123.
А если бы туда передавал не константу, а ссылку или разыменованный указатель, то код для второй фунции, наоборот, был бы короче.
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: func(int par) или func(int const& par)
От: glyph  
Дата: 04.10.04 14:11
Оценка:
Здравствуйте, Bell, Вы писали:

B>Здравствуйте, Аноним, Вы писали:


B>Как правило, встроенные типы эффективнее передавать по значению.

Интересно, почему? Передача по значению означает резервирование n байт в стеке. Если память нам некритична, то разницы нет — или мы работаем с памятью в стеке, или мы работаем с памятью, на которую передан указатель. Быстродействие одинаковое. Но заталкивание в стек параметров перед вызовом процедуры занимает некоторое время, пусть и незначительное. Так где же эффективность?
AFAIK, func(int const& par) нужно, чтобы компилятор сгенерировал предупреждение при попытке изменения par, т.к. в обоих случаях генерируется одинаковый код, по крайней мере на x86.
Re[3]: func(int par) или func(int const& par)
От: glyph  
Дата: 04.10.04 14:11
Оценка: -1
Здравствуйте, Privalov, Вы писали:
B>>Как правило, встроенные типы эффективнее передавать по значению.
P>Возможно. Но при передаче double, наверное будет небольшой выигрыш при передаче по ссылке (4 байта вместо 8).
А в случае с массивом выигрыш будет большой.
Re[4]: func(int par) или func(int const& par)
От: glyph  
Дата: 04.10.04 14:11
Оценка:
Здравствуйте, SWW, Вы писали:

B>>>Как правило, встроенные типы эффективнее передавать по значению.


P>>Возможно. Но при передаче double, наверное будет небольшой выигрыш при передаче по ссылке (4 байта вместо 8).

SWW>Переписываться они будут не побайтно, так что и здесь лучше по значению.
Как понять "Переписываться они будут не побайтно"?
Re[3]: func(int par) или func(int const& par)
От: Аноним  
Дата: 04.10.04 15:02
Оценка:
Здравствуйте, glyph, Вы писали:

B>>Как правило, встроенные типы эффективнее передавать по значению.

G> Интересно, почему? Передача по значению означает резервирование n байт в стеке. Если память нам некритична, то разницы нет — или мы работаем с памятью в стеке, или мы работаем с памятью, на которую передан указатель. Быстродействие одинаковое. Но заталкивание в стек параметров перед вызовом процедуры занимает некоторое время, пусть и незначительное. Так где же эффективность?
Да, но ведь в одном случае, наверное, будет использоваться mov, а во втором lea. Вот, наверное, и есть выйгрышь, хоть и микроскопический

З.Ы.: М-да. Мнения разошлись. Так как правильно все-таки?
Re: func(int par) или func(int const& par)
От: LaptevVV Россия  
Дата: 04.10.04 15:14
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Вызов какой функции быстрее?

А>В умных книгах пишут, что параметры в функцию лучше передавать типа unsigned const& par. Но ведь в данном случае оптимально: unsigned par. Или я не прав?
Если только у тебя не цикл в 100000000000000000...0000000000000 раз повторений, то не экономь на спичках. Существенная разница — для реализованных классов, бо там либо вызывается, либо не вызывается конструктор копирования.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: func(int par) или func(int const& par)
От: Mikka77  
Дата: 04.10.04 15:23
Оценка:
Здравствуйте, glyph, Вы писали:

G> А в случае с массивом выигрыш будет большой.


Так массивы и так всегда по ссылке передаются
"Количество времени, необходимое для решения задачи, не зависит от того, было это время использовано для решение данной задачи или нет." ©Mikka77
Re: func(int par) или func(int const& par)
От: jazzer Россия Skype: enerjazzer
Дата: 04.10.04 15:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть две функции.

А>То что в теле функции написано — не учитывать. Там бред
А>1-ая:
А>
А>unsigned Function(unsigned par)
А>{
А>  unsigned temp;
А>  temp=par;
А>  return temp;
А>}
А>
2-ая:

А>
А>unsigned Function(unsigned const& par)
А>{
А>  unsigned temp;
А>  temp=par;
А>  return temp;
А>}
А>

А>Вызов какой функции быстрее?
А>В умных книгах пишут, что параметры в функцию лучше передавать типа unsigned const& par. Но ведь в данном случае оптимально: unsigned par. Или я не прав?

самая умная книга, которая тебе все расскажет о твоем компиляторе и его оптимизаторе — это профайлер. Все остальное — спекуляции.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: func(int par) или func(int const& par)
От: Шахтер Интернет  
Дата: 04.10.04 17:09
Оценка:
Здравствуйте, glyph, Вы писали:

G>Здравствуйте, Bell, Вы писали:


B>>Здравствуйте, Аноним, Вы писали:


B>>Как правило, встроенные типы эффективнее передавать по значению.

G> Интересно, почему?

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

Стоит заметить ещё, что передача аргумента по значению и по ссылке семантически не эквивалентны.

G>Передача по значению означает резервирование n байт в стеке. Если память нам некритична, то разницы нет — или мы работаем с памятью в стеке, или мы работаем с памятью, на которую передан указатель. Быстродействие одинаковое. Но заталкивание в стек параметров перед вызовом процедуры занимает некоторое время, пусть и незначительное. Так где же эффективность?


А ссылку в стек можно засунуть без затрат?
... << RSDN@Home 1.1.0 stable >>
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[4]: func(int par) или func(int const& par)
От: glyph  
Дата: 05.10.04 10:44
Оценка:
Здравствуйте, Шахтер, Вы писали:

Ш>Потому что передача по ссылке добавляет уровень косвенности для доступа к значению переменной. Кроме того,

Гм. Не настолько это важно.
Ш> если аргумент -- ссылка, то компилятор в ряде случаев будет генерить временные объекты при вызове. И,
Да, действительно... Я
Ш>А ссылку в стек можно засунуть без затрат?
Однозначно ответить не могу.
Re[5]: func(int par) или func(int const& par)
От: LaptevVV Россия  
Дата: 05.10.04 10:55
Оценка:
Здравствуйте, Mikka77, Вы писали:

M>Здравствуйте, glyph, Вы писали:


G>> А в случае с массивом выигрыш будет большой.


M>Так массивы и так всегда по ссылке передаются

Не совсем так. Тип массива приводится к типу соответствующего указателя (а не ссылки).
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.