也就是说,如果我在磁盘上有一个std::complex
数组,它是以RIRIRIRI
还是RRRRIIII
或其他方式存储的?
我的真正问题是 - 如果我有一个包含两个数字的定义结构体,我能否将结构体的数组重新解释为使用期望std::complex
数组的函数?
那么memcpy
呢?如果我的两个结构都是浮点数,如果它们被存储相同,那应该没问题吧?
也就是说,如果我在磁盘上有一个std::complex
数组,它是以RIRIRIRI
还是RRRRIIII
或其他方式存储的?
我的真正问题是 - 如果我有一个包含两个数字的定义结构体,我能否将结构体的数组重新解释为使用期望std::complex
数组的函数?
那么memcpy
呢?如果我的两个结构都是浮点数,如果它们被存储相同,那应该没问题吧?
定义为:
std::complex array[COUNT];
存储在内存中的数组是RIRIRIRI格式,因为定义array[i]与i[array]相同,即*(array+i)。 如果该数组存储为RRRRIIII,则无法使用简单指针指向单个数组元素。
然而,在典型的现代PC中有一种情况,这个数组被存储为RRRRIIII:在将其复制到Direct3D 11+中的GPU的StructuredBuffer后。 复制RIRIRIRI数组到GPU的API调用可能会将其静默地重新排列为RRRRIIII,如果这样做可以提高GPU性能,实际上也确实如此。
RRRRIIII
。所有实数部分都在虚数部分之前。话虽如此,任何以这种方式依赖它的代码可能导致在某些平台或某些编译器上无法正常工作。 - OmnifariousRRRRIIII
不是正确的答案。在一个 std::complex
中,实数出现在虚数之前。数字没有任何“部分”。 - Heath Hunnicuttofstream file("somefile.txt");
file << complex_var.real() << "\t" << complex_var.imag() << "\n";
或者
file << complex_var << "\n";
后者将以文本形式存储为´(实部,虚部)`。如果以二进制模式写入,我不知道,但是尝试并查看生成的输出是一种简单(在这种情况下最有可能标准化)的方法来查看发生了什么。
我不确定磁盘上类数组的物理含义是什么。你不应该只是将字节写入磁盘,而应该使用真正的序列化。这样你就知道了表示方式。
至于你的其他问题,不要那样做,即使它看起来可以工作(现在可能是这样)。只需从数组中创建std::complex
对象并处理这些对象即可。