clang++ 直接将字符串序列化到二进制文件就可以了吗?

clang++ direct string serialization to binary file just works?

我天真地创建了这样的结构:

struct data{
    std::string name;
    std::string surname;
};

然后将这种类型的对象保存在我使用的文件中:

data d;
ifstream bin("filename", ios::binary);
bin.write(reinterpret_cast<char*>(&d), sizeof(data));

我在 macOS Sierra 上用 clang 编译了它。因为这是我的 CS 作业,其中一个要求是在 Windows 上构建 CodeBlocks,并且程序没有正确序列化。我开始寻找原因并发现我不能这样写数据而且我的代码是错误的。

我的问题是:为什么它在 clang 中正常工作,而显然不应该?

编辑: 我所说的正确工作是指我的程序写入和读取正确的结构而不会丢失字符串中的数据。

您正在做的事情在 C++ 中是不允许的,但它可能在某些平台上有效。具体来说,它可能在为 std::string 实现 "new" C++11 ABI 的平台上工作,它实现了 "small string optimization",其中短字符串(比如 31 个字符以下)直接存储在内部对象,而不是单独分配在堆上。

如果在序列化之前将 50 多个字符的长字符串放入数据中,它可能会开始失败。