gez*_*eza 51 c++ pointers offsetof language-lawyer c++17
看下面这个简单的代码:
struct Point {
int x;
int y;
};
void something(int *);
int main() {
Point p{1, 2};
something(&p.x);
return p.y;
}
Run Code Online (Sandbox Code Playgroud)
我希望main
可以将返回值优化为return 2;
,因为something
它无法访问p.y
,只能返回的指针p.x
。
但是,没有一个主要的编译器会优化main
to 的返回值2
。上帝保佑。
如果仅允许访问,标准中是否存在可以something
修改的内容?如果是,这是否取决于标准布局?p.y
p.x
Point
如果我使用something(&p.y);
,该return p.x;
怎么办?
Bar*_*rry 51
这是定义明确的:
void something(int *x) {
reinterpret_cast<Point*>(x)->y = 42;
}
Run Code Online (Sandbox Code Playgroud)
从[basic.compound]起,Point
对象(p
)及其x
成员是指针可互换的:
如果满足以下条件,则两个对象a和b是指针可互换的:
- [...]
- 一个是标准布局类对象,另一个是该对象的第一个非静态数据成员,或者,如果该对象没有非静态数据成员,则该对象的任何基类子对象([class.mem]) , 要么:
- [...]
如果两个对象是指针可互换的,则它们具有相同的地址,并且可以通过指向另一个指向另一个指针
reinterpret_cast
。
那reinterpret_cast<Point*>(x)
是有效的,并且确实以指向的指针结尾p
。因此,直接修改它很好。如您所见,标准布局部分和第一个非静态数据成员部分很重要。
尽管这不像所涉及的编译器优化的额外负担,如果您将指针传递给p.y
in并返回p.x
。