int i=0;
a[i] =3;
i++;
Vs
int i=0;
a[i++]=3;
它只是一种编写代码和保存行的奇特方式,或者你确实在这里提高了性能吗?
答案 0 :(得分:4)
使用https://godbolt.org/,启用优化的GCC会为这两种情况生成相同的代码。
main:
sub rsp, 8
mov esi, 3
mov edi, OFFSET FLAT:std::cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
xor eax, eax
add rsp, 8
ret
_GLOBAL__sub_I_main:
sub rsp, 8
mov edi, OFFSET FLAT:std::__ioinit
call std::ios_base::Init::Init()
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:std::__ioinit
mov edi, OFFSET FLAT:std::ios_base::Init::~Init()
add rsp, 8
jmp __cxa_atexit
注意:gcc已将std::cout << a[0]
优化为std::cout<<3
答案 1 :(得分:1)
除a[i++]=3;
更危险之外没有区别,因为将++
运算符与同一表达式中的其他运算符混合起来并不是一个好主意。
有关何时可能存在危险的示例,请参阅Why are these constructs (using ++) undefined behavior in C?。
资料来源:MISRA-C:2012年规则13.3等,见this。最新的MISRA中的措辞是++
不应该用于具有其他副作用的表达式。
答案 2 :(得分:1)
这两段代码本身在性能上的差异可以忽略不计。实际上,编译器可能会将这两种格式优化到相同的性能级别。将两者放置在一个循环中,其中i从0变为百万,运行时间差异为几毫秒,平均值可以忽略不计。
答案 3 :(得分:-2)
理论上(使用非常天真的编译器以代码表示代码)第二个代码段更快,因为在第一个代码段中有i
的多次读取。
但是已经说过,实际上它总是100%相同,因为编译器总会优化两者。
旁注: 不要再考虑这些微观优化,让编译器搞清楚。