也就是说,在磁盘上,如果我有一个数组std::complex
,它是存储的RIRIRIRI
还是RRRRIIII
其他的?
我真正的问题是 - 如果我定义了一个包含两个数字的结构,我可以重新解释我的结构的数组以使用需要数组的函数std::complex
吗?
那么memcpy呢?如果我的两个结构都是浮动的,如果它们存储相同,那应该可以吗?
也就是说,在磁盘上,如果我有一个数组std::complex
,它是存储的RIRIRIRI
还是RRRRIIII
其他的?
我真正的问题是 - 如果我定义了一个包含两个数字的结构,我可以重新解释我的结构的数组以使用需要数组的函数std::complex
吗?
那么memcpy呢?如果我的两个结构都是浮动的,如果它们存储相同,那应该可以吗?
定义如下的 std::complex 数组:
std::复数数组[COUNT];
...保证作为 RIRIRIRI 存储在内存中,因为根据定义,array[i] 与 i[array] 相同,也就是说 *(array+i)。如果数组存储为 RRRRIIII,则无法使用简单的指针指向单个数组元素。
但是,在典型的现代 PC 中存在一种情况,该数组存储为 RRRRIIII:在将其复制到 Direct3D 11+ 中 GPU 的 StructuredBuffer 之后。如果这提高了 GPU 性能,那么将 RIRIRIRI 数组复制到 GPU 的 API 调用可能会静默地将其重新排列为 RRRRIIII,实际上确实如此。
C++ 类只不过是一个struct
带有一些装饰的类。因此,类中定义的成员在内存中按顺序排列,对于该类型的每个元素都是连续排列的。换句话说,std::complex
每个元素都包含的数组RI
将被存储RIRIRIRI
。
您可能可以侥幸逃脱reinterpret_cast
,但如果您这样做,您将取决于std::complex
实现——这可能会很好。
这完全取决于您首先如何将这些存储在文件中。
你可以这样做:
ofstream file("somefile.txt");
file << complex_var.real() << "\t" << complex_var.imag() << "\n";
或者
file << complex_var << "\n";
后者会将其(以文本形式)存储为“(实部,虚部)”。如果以二进制模式编写,我不知道,但简单地尝试查看生成的输出将是一种简单的(并且在这种情况下很可能是标准化的)查看发生了什么的方法。
我不确定磁盘上类数组的物理含义是什么。您不应该只是将字节写入磁盘,而应该使用真正的序列化。然后你自己就知道这个表示了。
至于您的其他问题,即使它看起来有效(现在可能)也不要这样做。只需std::complex
从数组中的对创建对象并处理这些对象。