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

4

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

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

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


3
也许你想看一下这个问题:https://dev59.com/AlTTa4cB1Zd3GeqPr2TR#5020146 - Matteo Italia
我类似问题的答案可能会很有趣:https://dev59.com/51TTa4cB1Zd3GeqPs4LG - Tom
4个回答

3

定义为:

std::complex array[COUNT];

存储在内存中的数组是RIRIRIRI格式,因为定义array[i]与i[array]相同,即*(array+i)。 如果该数组存储为RRRRIIII,则无法使用简单指针指向单个数组元素。

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


2
一个C++类只是一个带有一些修饰的结构体。因此,类中定义的成员在内存中按顺序排列,并且每个类型的元素都是连续的。换句话说,一个包含RI的std::complex数组将被存储为RIRIRIRI。
你可能可以使用reinterpret_cast,但如果这样做,你将依赖于std::complex的实现--而那可能会很好。

我认为你的意思是RRRRIIII。所有实数部分都在虚数部分之前。话虽如此,任何以这种方式依赖它的代码可能导致在某些平台或某些编译器上无法正常工作。 - Omnifarious
不,RRRRIIII 不是正确的答案。在一个 std::complex 中,实数出现在虚数之前。数字没有任何“部分”。 - Heath Hunnicutt
@Heath Hunnicutt:哦!糟糕,我在原帖中漏掉了“数组”这个词。 - Omnifarious
顺便说一下,我们在openhatch.org地图上是邻居。 - Heath Hunnicutt
@Heath Hunnicutt:是啊,我也在想那个网站的数据是从哪里获取的。 - Omnifarious
@Omnifarious:我不确定你的情况,但在我的情况下,它是通过我输入我的地址来获取数据的。 - Heath Hunnicutt

1
这完全取决于您最初如何在文件中存储它们。
您可以这样做:
ofstream file("somefile.txt");

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

或者

file << complex_var << "\n";

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


1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接