gpt4 book ai didi

c++ - 是否可以通过指向另一个不相关的子对象的指针来获取指向一个子对象的指针?

转载 作者:行者123 更新时间:2023-12-02 01:45:36 27 4
gpt4 key购买 nike

看看这个简单的代码:

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 的返回值优化为 2Godbolt .

如果我们只授予对 p.x 的访问权限,标准中是否有某些内容允许 something 修改 p.y?如果是,这是否取决于 Point 是否具有标准布局?

如果我使用 something(&p.y); 并改为 return p.x; 会怎样?

最佳答案

这是完全明确的:

void something(int *x) {
reinterpret_cast<Point*>(x)->y = 42;
}

Point对象 ( p ) 及其 x成员是指针可相互转换的,来自 [basic.compound] :

Two objects a and b are pointer-interconvertible if:

  • [...]
  • one is a standard-layout class object and the other is the first non-static data member of that object, or, if the object has no non-static data members, any base class subobject of that object ([class.mem]), or:
  • [...]

If two objects are pointer-interconvertible, then they have the same address, and it is possible to obtain a pointer to one from a pointer to the other via a reinterpret_­cast.

那个reinterpret_cast<Point*>(x)有效并且最终得到一个指向 p 的指针。所以直接修改就可以了。正如您所看到的,标准布局部分和第一个非静态数据成员部分很重要。

<小时/>

尽管如果您将指针传递给p.y,那么相关编译器不会优化额外的负载。输入并返回p.x相反。

关于c++ - 是否可以通过指向另一个不相关的子对象的指针来获取指向一个子对象的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57979009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com