在为数组赋值时是否存在性能差异

时间:2018-05-31 12:43:26

标签: c++ c arrays

int i=0;
a[i] =3;
i++;

Vs

int i=0;
a[i++]=3;

它只是一种编写代码和保存行的奇特方式,或者你确实在这里提高了性能吗?

4 个答案:

答案 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%相同,因为编译器总会优化两者。

旁注: 不要再考虑这些微观优化,让编译器搞清楚。