gpt4 book ai didi

c++ - char* 转换和别名规则

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:47 26 4
gpt4 key购买 nike

根据严格的别名规则:

struct B { virtual ~B() {} };
struct D : public B { };

D d;
char *c = reinterpret_cast<char*>(&d);

char* 对任何不同类型的对象都是有效的。但是现在的问题是,它会指向&d的同一个地址吗? C++ 标准对返回相同地址的保证是什么?

最佳答案

c&d确实具有相同的值,如果您重新解释-cast c回到D*你得到一个有效的指针,你可以取消引用。此外,您可以对待 c作为(指向第一个元素的指针)不透明数组 char[sizeof(D)] -- 这确实是将指针转换为 char 指针的主要目的:允许(反)序列化(例如 ofile.write(c, sizeof(D)); ),尽管您通常应该只对原始类型(及其数组)执行此操作,因为的二进制布局复合类型通常不以可移植的方式指定。

正如@Oli 正确指出并希望我强调的那样,你真的不应该将复合类型作为一个整体进行序列化。结果几乎永远不会反序列化,因为多态类的实现和数据字段之间的填充未指定且您无法访问。

请注意 reinterpret_cast<char*>(static_cast<B*>(&d))可能被视为不透明数组 char[sizeof(B)]通过类似的推理。

关于c++ - char* 转换和别名规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8555175/

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