4

也就是说,在磁盘上,如果我有一个数组std::complex,它是存储的RIRIRIRI还是RRRRIIII其他的?

我真正的问题是 - 如果我定义了一个包含两个数字的结构,我可以重新解释我的结构的数组以使用需要数组的函数std::complex吗?

那么memcpy呢?如果我的两个结构都是浮动的,如果它们存储相同,那应该可以吗?

4

4 回答 4

3

定义如下的 std::complex 数组:

std::复数数组[COUNT];

...保证作为 RIRIRIRI 存储在内存中,因为根据定义,array[i] 与 i[array] 相同,也就是说 *(array+i)。如果数组存储为 RRRRIIII,则无法使用简单的指针指向单个数组元素。

但是,在典型的现代 PC 中存在一种情况,该数组存储为 RRRRIIII:在将其复制到 Direct3D 11+ 中 GPU 的 StructuredBuffer 之后。如果这提高了 GPU 性能,那么将 RIRIRIRI 数组复制到 GPU 的 API 调用可能会静默地将其重新排列为 RRRRIIII,实际上确实如此。

于 2011-03-16T00:16:50.960 回答
2

C++ 类只不过是一个struct带有一些装饰的类。因此,类中定义的成员在内存中按顺序排列,对于该类型的每个元素都是连续排列的。换句话说,std::complex每个元素都包含的数组RI将被存储RIRIRIRI

您可能可以侥幸逃脱reinterpret_cast,但如果您这样做,您将取决于std::complex实现——这可能会很好。

于 2011-03-15T20:46:52.967 回答
1

这完全取决于您首先如何将这些存储在文件中。

你可以这样做:

ofstream file("somefile.txt");

file << complex_var.real() << "\t" << complex_var.imag() << "\n";

或者

file << complex_var << "\n";

后者会将其(以文本形式)存储为“(实部,虚部)”。如果以二进制模式编写,我不知道,但简单地尝试查看生成的输出将是一种简单的(并且在这种情况下很可能是标准化的)查看发生了什么的方法。

于 2011-03-15T20:49:03.993 回答
1

我不确定磁盘上类数组的物理含义是什么。您不应该只是将字节写入磁盘,而应该使用真正的序列化。然后你自己就知道这个表示了。

至于您的其他问题,即使它看起来有效(现在可能)也不要这样做。只需std::complex从数组中的对创建对象并处理这些对象。

于 2011-03-15T20:49:36.617 回答