Visual Studio 2010 (Express) does, in simple cases, which I tested at least. Can anyone check gcc?
I tested the following:
1. Transmission only i :
int vars[] = {1,2,3,12,3,23,1,213,231,1,21,12,213,21321,213,123213,213123}; int ok1(const int i){ return sqrtl(vars[i]); } int ok2(const int & i){ return sqrtl(vars[i]); } void main() { int i; std::cin >> i;
ASM:
i = ok1(i); 000D1014 mov ecx,dword ptr [i] 000D1017 fild dword ptr vars (0D3018h)[ecx*4] 000D101E call _CIsqrt (0D1830h) 000D1023 call _ftol2_sse (0D1840h) i = ok2(i); 013A1014 mov ecx,dword ptr [i] 013A1017 fild dword ptr vars (13A3018h)[ecx*4] 013A101E call _CIsqrt (13A1830h) 013A1023 call _ftol2_sse (13A1840h)
Well, ASMs are identical; no doubt, optimization has been performed.
2. Transfer of i and &i :
Consider here @newacct anser.
int vars[] = {1,2,3,12,3,23,1,213,231,1,21,12,213,21321,213,123213,213123}; int ok1(const int i, int * pi) { *pi = 2; return sqrtl(vars[i]); } int ok2(const int & i, int * pi) { *pi = 2; return sqrtl(vars[i]); } void main() { int i; int * pi = &i; std::cin >> i; i = ok1(i, pi);
ASM:
i = ok1(i, pi); 00891014 mov ecx,dword ptr [i] 00891017 fild dword ptr vars (893018h)[ecx*4] // access vars[i] 0089101E call _CIsqrt (891830h) 00891023 call _ftol2_sse (891840h) i = ok2(i, pi); 011B1014 fild dword ptr [vars+8 (11B3020h)] // access vars[2] 011B101A call _CIsqrt (11B1830h) 011B101F call _ftol2_sse (11B1840h)
In ok1 I do not see him writing 2 in pi . He probably understands that the memory location will be overwritten by the result of the function in any case, so writing is useless.
With ok2 , the compiler is as smart as I expected. He understands that i and pi pointing to the same place, so he directly uses hard-coded 2 .
Notes:
- I compiled twice for both tests, once uncommenting only
ok1 , after uncommenting only ok2 . Compiling both at the same time leads to more complex optimization between the two functions, which eventually become all nested and mixed. - I added a search to the
vars array because simple sqrtl calls were simplified into basic ADD and MUL type operations without actually calling - Compiled in version
- Got the expected results, of course