c++ - 静态和重新解释铸造 - 定义的行为?
问题描述
首先,我来自一个“管理”的土地,所以要温柔。我正在尝试创建一个消息传递系统,在我投入太多精力之前,我想确保我对转换的理解是正确的。
假设我有一个名为 header 的 pod 类型并将该 header 放入另一个 pod 类型的消息中,我可以安全地将消息 static_cast 到 header 并将 header 指针重新解释为消息指针吗?
如果我理解正确,投射到 pod 的第一个成员是安全的,并且重新解释投射对于返回到我的原始指针应该是安全的吗?
例子:
struct Header
{
int m_size;
int m_type;
};
struct Message
{
// first member to static cast to..
Header m_header;
};
//
int main()
{
Message msg;
// cast to the first member, the header.
auto* hdr = static_cast<Header*>(&msg.m_header);
// because I know the message by type, safely cast it back to the original message type.
Message* tmp = reinterpret_cast<Message*>(hdr);
return 0;
}
解决方案
我可以安全地将消息静态转换为标题吗
不,这样的静态演员阵容不正确。不过,类似的重新解释演员阵容将得到很好的定义……只要您陈述的先决条件为真。如果您错误地假设它们,则程序的行为是未定义的。
正如评论中所指出的,您的代码示例静态将标头指针转换为标头指针,该标头指针当然定义明确,但不是您所问的。
并将标头指针重新解释为消息指针?
是的。
推荐阅读
- android - (android) 为什么 app:actionLayout="" 不起作用?
- c# - 可导航类抛出异常时如何处理?
- python - 将 PayPal 结帐与 Kivy 应用程序集成?
- julia - 如何在 Clustering.jl 中将基于距离的算法转换为基于点的 DBscan 算法以进行异常值检测
- python - Python:有没有办法解析过滤器中的元组?
- immer.js - 为什么要为这个功能使用 immer?
- python - Apache Beam 数据流有效地从 PubSub 到 GCS 正确分片和映射消息
- javascript - JS & Lodash 数组查找和删除方法
- c++ - TrackMouseEvent 问题
- node.js - Node.js 端点不工作,但另一个端点工作