clang ++直接字符串序列化到二进制文件是否有效?

时间:2017-01-28 09:43:13

标签: 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上用clang编译了它。因为这是我的CS分配,其中一个要求是在Windows上的CodeBlocks中构建,并且程序没有正确序列化。我开始寻找原因并发现我无法以这种方式编写数据而且我的代码是错误的。

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

编辑: 通过正确工作,我的意思是我的程序写入和读取正确的结构而不会丢失字符串中的数据。

1 个答案:

答案 0 :(得分:1)

您在C ++中不允许执行的操作,但它可能适用于某些平台。具体来说,它可能适用于为std :: string实现“新”C ++ 11 ABI的平台,它实现了“小字符串优化”,其中短字符串(例如,31个字符)直接存储在对象内部,而不是在堆上单独分配。

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