【发布时间】:2016-06-10 21:01:45
【问题描述】:
我刚刚在 C++ 中发现了 reinterpret_cast,我正在尝试了解更多有关它的信息。我写了这段代码:
struct Human{
string name;
char gender;
int age;
Human(string n, char g, int a) : name(n), gender(g), age(a) {}
};
int main()
{
Human h("John", 'M', 26);
char* s = reinterpret_cast<char*>(&h);
Human *hh = reinterpret_cast<Human*>(s);
cout << hh->name << " " << hh->gender << " " << hh->age << endl;
}
效果很好,完全符合预期。现在我想将char * 转换为std::string,然后从这个字符串中取回Human 对象:
int main()
{
Human h("John", 'M', 26);
char* s = reinterpret_cast<char*>(&h);
string str = s;
Human *hh = reinterpret_cast<Human*>(&str);
cout << hh->name << " " << hh->gender << " " << hh->age << endl; // prints wrong values
}
有没有人想办法克服这个问题?
谢谢。
【问题讨论】:
-
虽然有一些方法可以使这项工作发挥作用,但这闻起来很有趣。事实上,这闻起来像 meta.stackexchange.com/questions/66377/what-is-the-xy-problem 。那么,您认为使用这种方法需要解决的真正问题是什么?
-
第一个例子严重违反了the strict aliasing rule。
-
好吧,正如链接文章中所解释的那样,“char *”可以免除别名。即使这实际上没问题,但仍然不推荐。
-
@A.Omar 啊,那么是的,您可以将指向对象的指针转换为另一个指针。但是,这很重要,尝试通过套接字发送任何复杂的东西在几乎所有情况下都不会按预期工作。以普通的
std::string为例。std::string对象实际上并不包含实际的字符串,它包含一个指向字符串的 pointer,发送std::string对象将发送指针而不是它指向的数据(字符串) .在另一个过程中,您收到的指针不会指向同一事物(如果在任何有效内存中)。 -
@A.Omar:虽然这在理论上可行,但有时这不是一个好主意。首先,您的结构不能包含单个指针(或对象中的指针),因为它没有意义。此外,诸如位数、类型大小、打包、编译器、编译器版本和字节序差异等许多因素都会改变结构在跨平台内存中的布局方式。如果您需要序列化一个对象 - 只需以已知格式逐字节写入即可。
标签: c++ string object casting reinterpret-cast