我知道这可以获取索引(并自动执行指针算术):
struct Obj *c = &p[i];
但是,与手动执行指针算术相比,这是否会对性能产生影响?
struct Obj *c = p+i;
有什么理由可以避免使用第一个?
但是,与手动执行指针算术相比,这是否会对性能产生影响?
使用索引运算符的表达式被定义为等效于涉及指针算术和解引用的相应操作,因此
&p[i]
Run Code Online (Sandbox Code Playgroud)
完全等同于
&(*(p + i))
Run Code Online (Sandbox Code Playgroud)
该标准还规定,当运算&符的操作数是运算符的结果时*,均不会被评估,并且结果好像都被忽略了,因此依次等于
p + i
Run Code Online (Sandbox Code Playgroud)
,它已定义了行为,只要它不希望产生一个指向要从其p派生指针的数组的开始之前指向的指针,并且不超过其末尾的一个位置即可。
尽管可以想象编译器在一种情况下会产生与另一种情况不同或更差的代码,但是没有理由期望这样做。
有什么理由可以避免使用第一个?
不多。后者具有较轻的认知负担,并且更易于阅读,因为(在语法上)仅涉及一项操作而不是两项操作。由于这个原因,我本人倾向于自己喜欢它。另一方面,理解它可能会不太直观。