为何传递成员变量指针给函数会阻碍其他成员变量的优化?
关于C++中对象成员指针传递后对象修改合法性的问题
测试程序
struct X { bool b; int y; }; void f(int*); bool test(X x) { if (!x.b) { return false; } f(&x.y); return x.b; }
在这个程序里,return x.b;语句并未被编译器优化为return true;——明明之前已经通过if (!x.b)判定了x.b为true。这说明编译器必须假设f(int*)可能通过某种方式修改x.b。
推测的f实现
编译器考虑的可能性之一是f的实现如下:
void f(int* p) { bool* q = reinterpret_cast<bool*>(p - 1); *q = false; }
核心问题
- 上述
f的实现是否属于合法的C++代码? - 当向未知函数(opaque function)传递对象成员的指针时,编译器是否必须假设整个对象都可能被修改?
Clang编译输出(x86 trunk,-O1)
test(X): # @test(X) push rax mov qword ptr [rsp], rdi test dil, dil je .LBB0_1 lea rdi, [rsp + 4] call f(int*)@PLT cmp byte ptr [rsp], 0 setne al pop rcx ret .LBB0_1: xor eax, eax pop rcx ret
结论
如果仅按示例中的方式调用f,该实现是合法的。因此编译器必须考虑这种可能性:外部函数可以通过成员指针逆推得到对象其他成员的地址并修改,所以不能对x.b的值做“始终为true”的优化假设。
内容的提问来源于stack exchange,提问作者chrysante
相关产品推荐
相关产品推荐

