也就是说,在磁盘上,如果我有一个std::complex
数组,它是存储RIRIRIRI
还是RRRRIIII
还是其他什么?
我真正的问题是 - 如果我有一个我定义的结构包含两个数字,我可以重新解释一下我的结构数组,以使用期望std::complex
数组的函数吗?
memcpy怎么样?如果我的两个结构都是浮点数,那么如果它们存储的话应该没问题呢?
答案 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
个对象并处理这些对象。