variant是联合的替代。
但联合可以通过网络安全地在另一个平台(不同的编译器或arch)中接收。std::variant能做到吗?
例如,我有两台机器A和B。A是windows,MSVC 19.4。B是Linux,gcc(或其他编译器,如MSVC17)。我在A(或B)下编译代码:
std::variant<int, double> v = 1; // holds int.
f.write(&v, sizeof(v));
B可以使用相同文件中的以下代码读取正确的值吗?
std::variant<int, double> v;
f.read(&v, sizeof(v));
如果std::variant不能安全地通过网络。有没有什么库提供这样的功能?boost::变体?或者创建一个行为类似std::variant的自定义实现?
发布于 2020-02-24 11:01:26
通常,C++中的联合、变体或许多其他类型都不能被内存转储到文件中,然后安全地读取。
当跨多个平台(即硬件)传输数据时,许多事情可能会使传输不安全:
int
类型在一个平台上可以是4个字节,在另一个平台上可以是8个字节。)CHAR_BIT
,通常是8位,假设这只适用于几个神秘的many浮点实现)。(目前大多数硬件都使用IEEE-754,但C++标准不要求这样做)因此,跨平台传输数据的唯一安全方法是使用标准化的中间数据格式,这通常称为序列化。很多库可以帮助你解决这个问题。下面是一些值得研究的内容
如果问题更多地针对std::variant
的内存布局,那么对于std::variant
和任何其他std
容器都是一样的:内存布局是由实现定义的。(这里的实现是指使用的标准库实现)。例如,一些标准库在std::string
中做了一个小字符串优化,它可以包含没有堆分配的小字符串(比如少于32个字符)。有些没有,所以相同类型的内存布局会有很大的不同。
因此,要么保证发送方和接收方具有相同的硬件和标准库实现,要么使用序列化库来确保到达的数据与发送的数据相同。
https://stackoverflow.com/questions/60368630
复制相似问题