You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++20/C++23合规性探讨:从异类型相邻对象指针推导目标指针

从相邻内存的X对象指针推导Y对象指针的标准合规性问题

我们有两个不同类型的对象,它们恰好在内存中相邻存放,示例代码如下:

struct X {
    alignas(long) int val = 1;
};

struct Y {
    long val = 2;
};

// ...

std::byte* buf = new std::byte[sizeof(X) + sizeof(Y)];
X* x = new (buf) X();
new (buf + sizeof(X)) Y();

已知指针x,且明确Y实例在内存中相对于x的位置,是否存在符合C20或C23标准的方法,从x推导出Y实例的指针?

换句话说,以下代码是否符合标准,或者有没有办法让它符合标准:

Y* y = std::launder(reinterpret_cast<Y*>(reinterpret_cast<std::byte*>(x) + sizeof(X)));
y->val = 3;

我怀疑这段代码在C20或C23中均不符合标准,理由如下:

  • P1839R5文档指出,实际上无法获取指向对象表示的有效指针。
  • 即便有P1839R5修订后的指针算术规则,似乎仍然无法从一个对象表示的指针转换到另一个对象表示的指针。

内容的提问来源于stack exchange,提问作者Michael Kourlas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:25:25