gpt4 book ai didi

c++ - 使用重新解释转换将结构或类保存到文件

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

这是教授在他的剧本中向我们展示的东西。我没有在我编写的任何代码中使用过这种方法。

基本上,我们采用一个类或结构,然后重新解释_cast 并保存整个结构,如下所示:

struct Account
{
Account()
{ }
Account(std::string one, std::string two)
: login_(one), pass_(two)
{ }

private:
std::string login_;
std::string pass_;
};

int main()
{
Account *acc = new Account("Christian", "abc123");

std::ofstream out("File.txt", std::ios::binary);
out.write(reinterpret_cast<char*>(acc), sizeof(Account));
out.close();

这会产生输出(在文件中)

ÍÍÍÍChristian ÍÍÍÍÍÍ              ÍÍÍÍabc123 ÍÍÍÍÍÍÍÍÍ     

我很困惑。这种方法是否真的有效,或者它是否会导致 UB,因为神奇的事情发生在类和结构中,这些事情是个别编译器的心血来潮?

最佳答案

它实际上不起作用,但它也不会导致未定义的行为。

在 C++ 中,将任何对象重新解释为 char 数组是合法的,因此这里没有未定义的行为。

然而,结果通常仅在类是 POD(有效,如果类是简单的 C 风格结构)和自包含(即结构没有指针数据成员)时可用。

这里,Account 不是 POD,因为它有 std::string 成员。 std::string 的内部是实现定义的,但它不是 POD,它通常有指针指向存储实际字符串的一些堆分配 block (在您的特定示例中,实现使用小字符串优化,其中字符串的值存储在 std::string 对象本身中)。

有几个问题:

  • 您并不总能获得预期的结果。如果您有更长的字符串,std::string 将使用在堆上分配的缓冲区来存储字符串,因此您最终只会序列化指针,而不是指向的字符串。

  • 您实际上不能使用您在此处序列化的数据。您不能只是将数据重新解释为 Account 并期望它起作用,因为不会调用 std::string 构造函数。

简而言之,您不能使用这种方法序列化复杂的数据结构。

关于c++ - 使用重新解释转换将结构或类保存到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4392597/

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