Let's consider an object foo
(which may be an int
, a double
, a custom struct
, a class
, whatever). My understanding is that passing foo
by reference to a function (or just passing a pointer to foo
) leads to higher performance since we avoid making a local copy (which could be expensive if foo
is large).
However, from the answer here it seems that pointers on a 64-bit system can be expected in practice to have a size of 8 bytes, regardless of what's being pointed. On my system, a float
is 4 bytes. Does that mean that if foo
is of type float
, then it is more efficient to just pass foo
by value rather than give a pointer to it (assuming no other constraints that would make using one more efficient than the other inside the function)?
Which is preferred in Passing by Pointer Vs Passing by Reference in C++? References are usually preferred over pointers whenever we don't need “reseating”. Overall, Use references when you can, and pointers when you have to.
Pass-by-references is more efficient than pass-by-value, because it does not copy the arguments. The formal parameter is an alias for the argument. When the called function read or write the formal parameter, it is actually read or write the argument itself.
It's much faster and memory-efficient to copy a pointer than to copy many of the things a pointer is likely to point to. A reference is stored in as many bytes as required to hold an address on the computer. This often makes reference much smaller than the things they refer to.
Time and space cost One advantage of call by reference over call by value-result is that it is often cheaper, especially if the data to be passed is large (time/space costs of copying). Call by reference may have a time cost because of indirect addressing, though that can sometimes be optimized out.
It depends on what you mean by "cost", and properties of the host system (hardware, operating system) with respect to operations.
If your cost measure is memory usage, then the calculation of cost is obvious - add up the sizes of whatever is being copied.
If your measure is execution speed (or "efficiency") then the game is different. Hardware (and operating systems and compiler) tend to be optimised for performance of operations on copying things of particular sizes, by virtue of dedicated circuits (machine registers, and how they are used).
It is common, for example, for a machine to have an architecture (machine registers, memory architecture, etc) which result in a "sweet spot" - copying variables of some size is most "efficient", but copying larger OR SMALLER variables is less so. Larger variables will cost more to copy, because there may be a need to do multiple copies of smaller chunks. Smaller ones may also cost more, because the compiler needs to copy the smaller value into a larger variable (or register), do the operations on it, then copy the value back.
Examples with floating point include some cray supercomputers, which natively support double precision floating point (aka double
in C++), and all operations on single precision (aka float
in C++) are emulated in software. Some older 32-bit x86 CPUs also worked internally with 32-bit integers, and operations on 16-bit integers required more clock cycles due to translation to/from 32-bit (this is not true with more modern 32-bit or 64-bit x86 processors, as they allow copying 16-bit integers to/from 32-bit registers, and operating on them, with fewer such penalties).
It is a bit of a no-brainer that copying a very large structure by value will be less efficient than creating and copying its address. But, because of factors like the above, the cross-over point between "best to copy something of that size by value" and "best to pass its address" is less clear.
Pointers and references tend to be implemented in a similar manner (e.g. pass by reference can be implemented in the same way as passing a pointer) but that is not guaranteed.
The only way to be sure is to measure it. And realise that the measurements will vary between systems.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With