std :: complex是否以交错的方式存储?

时间:2011-03-15 20:41:47

标签: c++ casting reinterpret-cast

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

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

memcpy怎么样?如果我的两个结构都是浮点数,那么如果它们存储的话应该没问题呢?

4 个答案:

答案 0 :(得分:2)

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

你可能可以使用reinterpret_cast,但如果你这样做,你将依赖std::complex实施 - 这可能会很好。

答案 1 :(得分:2)

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

std :: complex array [COUNT];

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

然而,在典型的现代PC中存在一种情况,其中该数组被存储为RRRRIIII:在将其复制到Direct3D 11+中的GPU的StructuredBuffer之后。将RIRIRIRI数组复制到GPU的API调用可以默默地将其重新排列为RRRRIIII,如果这样可以提高GPU性能,实际上它可以实现。

答案 2 :(得分:1)

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

你可以做到:

ofstream file("somefile.txt");

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

或者

file << complex_var << "\n";

后者将它(以文本形式)存储为'(realpart,imaginarypart)`。如果以二进制模式编写,我不会知道,但只是尝试并查看生成的输出将是一种简单的(在这种情况下很可能是标准化的)方式来查看发生的情况。

答案 3 :(得分:1)

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

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