【发布时间】:2020-01-18 14:22:34
【问题描述】:
看看这个简单的代码:
struct Point {
int x;
int y;
};
void something(int *);
int main() {
Point p{1, 2};
something(&p.x);
return p.y;
}
我希望main 的返回值可以优化为return 2;,因为something 无法访问p.y,它只能获得指向p.x 的指针。
但是,没有一个主要的编译器将main 的返回值优化为2。 Godbolt.
如果我们只授予p.x 的访问权限,标准中是否有允许something 修改p.y 的内容?如果是,这是否取决于Point 是否有标准布局?
如果我改用something(&p.y); 和return p.x; 会怎样?
【问题讨论】:
-
我不明白反对票和旗帜。这对我来说是完全合理的问题。
-
stackoverflow.com/questions/50803202/… "实现对齐要求可能会导致两个相邻的成员不能紧挨着分配"
-
@alterigel:这不重要,因为我们可以使用
offsetof。但我不确定我们是否真的可以使用 C++17 的新指针语义规则从p.x获得指向p.y的指针。不能使用std::launder,因为指向p.x的指针只能到达p.x。因此,即使我可以将指针移动到正确的位置,也可能该指针不会指向p.y的对象。 -
如果将其更改为
void something(int * x) { *(x+1) = 6; },它会将返回值优化为固定的6,因此编译器至少认为这是一个有效的选项。 -
@zereges,没有投反对票,但几乎投了。这个问题很难解析。我相信 OP 在问:“为什么编译器不能意识到 something() 函数不会修改 p.y ?”如果 OP 直接问这个问题,那么反对票就会减少。
标签: c++ pointers language-lawyer c++17 offsetof