给出以下表达式,其中A和B代表任意操作数(例如局部或全局变量,函数返回的值等)
A -= B;
我们是否可以在不改变含义的情况下将其替换为以下内容?
(type of A)* temp = &(A);
(*temp) = (*temp) - B;
return (*temp); // implicit
似乎有效,只要A的类型不是易失性/原子。
简单的测试用例:
extern int f (void);
return *f() -= 5;
// is equivalent to
(int)* temp = &(*f()); // single call to function
(*temp) = (*temp) - B;
return (*temp);
另:
extern int * p;
return p -= 5;
// is equivalent to
(int*)* temp = &(p);
(*temp) = (*temp) - 5; // pointer arithmetic works fine
return (*temp);
答案 0 :(得分:1)
没有
extern volatile int i;
extern volatile int j;
int f(void) {
return i += j;
}
int g(void) {
volatile int *ip = &i;
*ip = *ip + j;
return *ip;
}
编译到
f:
movl j(%rip), %edx
movl i(%rip), %eax
addl %edx, %eax
movl %eax, i(%rip)
ret
g:
movl i(%rip), %eax
movl j(%rip), %edx
addl %edx, %eax
movl %eax, i(%rip)
movl i(%rip), %eax
ret
i的负载数量不同会导致不同的行为,例如,如果i用于内存映射硬件IO。
答案 1 :(得分:0)
没有必要让它变得复杂,它会破坏可读性,也就是这段代码:
(type of A)* temp = &(A);
(*temp) = (*temp) - B;
return (*temp); // implicit
将由编译器优化。