|"However, references returned also have to be put into temporaries. So what about built-in data types like int and float?"|
Intrinsic types such as "int
" and "float
" and are well-known by the compiler are more likely to become subject to optimisations than user-defined types.
|"these are 4 bytes, and references to them are also 4 bytes (I hear they can be 2 bytes depending on how far the address is)."|
Hold your horses, here; you're treading on implementation-defined information.
Firstly, the size of intrinsic data-types varies from compiler-to-compiler, so I'll go ahead and assume the size of "float
" and "int
" are 4-bytes on your system.
Secondly, the term "reference
" in C++ is reserved by the "reference
" type, in which case, references may or may not reserve memory for the storage of its referent. Though, because you said "can be 2 bytes depending on how far the address is
", I'm going to assume that you're referring to a "pointer
". If the latter is the case then you should know that on modern systems, the days of "far
" and "near
" pointers have since passed and that pointers generally (but not always) have a consistent size.
|"So wouldn't that make int++ and ++int cost the exact same since a reference to an int is the exact same size as an int?"|
Hard to tell. The post-fix operators have one additional parameter, which is usually unused, that adds to the overhead of the call to the operator. However, a smart compiler will not push unused parameters onto the stack.
You're right, both post- and pre-fix operators of intrinsic types create copies of its operand, but those copies are justified to give you the expected output. When comparing the post- and pre-fix operators, you'll notice that the post-fix operators will create 1 additional temporary copy of the operand than the pre-fix operators, thereby making pre-fix operators more efficient.
More over, each compiler may perform post- and pre-fix operations differently; some implementations may perform faster than others. Based on the optimisation scheme your have in place for your program, your operators may perform differently.