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

C++ clang++将字符串直接序列化到二进制文件就行了吗?,c++,string,serialization,clang++,C++,String,Serialization,Clang++,我无意中创建了如下结构: 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上用叮当声编译了它。因为这是我的CS任务,其中一个要

我无意中创建了如下结构:

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上用叮当声编译了它。因为这是我的CS任务,其中一个要求是在Windows上构建代码块,并且程序不能正确序列化。我开始寻找原因,发现我不能这样写数据,我的代码就是错的

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

编辑:
通过正确工作,我的意思是我的程序在不丢失字符串的情况下编写和读取正确的结构。

< P>在C++中不允许做什么,但是它可能在一些平台上工作。具体来说,它可能在实现新的C++11 ABI for std::string的平台上工作,该平台实现了小字符串优化,即将31个字符以下的短字符串直接存储在对象内部,而不是单独分配在堆上


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

为什么它在clang中正常工作?它编译吗?跑回读时产生正确的结果?d的字符串有多长?试着让它们长一点。那么您的代码可能会停止工作。正确序列化意味着什么?除了产生无意义的垃圾,您对代码还有什么期望?你用长字符串测试过吗?IIRC,即使是一些使用SSO的实现也无法工作,因为它们仍然在内部使用指针。没有新的C++11 ABI,也没有实现任何标准的SSO部分的ABI。@KerrekSB:我没有使用“标准”这个词,也没有使用OP。不确定你在讲什么。当你说,这意味着在某种程度上只有一个,事实上有任何一个,我对这两个都有争议。