gpt4 book ai didi

C# 数据局部性 : reference type in an array of structs

转载 作者:行者123 更新时间:2023-11-30 17:36:32 25 4
gpt4 key购买 nike

我已经阅读了很多关于数据局部性的文章,但没有找到这个问题的答案:如果我创建一个结构数组以便拥有一个连续的内存块(比如 MyStruct,它由值类型组成) ,然后在我的MyStruct中添加一个字符串,这个字符串是分配到哪里的呢?简而言之,声明为结构成员(数组中的项目)的引用类型是否能很好地处理缓存行的获取?或者我是否最终获取了一个引用,然后必须定位它,这破坏了首先创建结构数组的整个目的?

我相信我的措辞是正确的,但我觉得它有点滑。

非常感谢您的宝贵时间。

编辑:我意识到字符串是在堆上分配的,只是想知道连续方面......

最佳答案

给定:

struct MyStruct { 字符串成员; }
类 MyClass { 字符串成员; }

MyStruct[] 将具有与 string[] 几乎相同的布局 - 也就是说,您有一个 4/8 字节的连续数组引用 字符串实例,例如,您可以在不接触非连续数据的情况下与 object.ReferenceEquals(...) 进行比较。然而,字符串实例本身——关于长度、散列、字符、原始相等性的数据(因为字符串在这些方面重载 ==)等——不是这个连续 block 的一部分,因为字符串是引用类型。

这仍然比 MyClass[] 更好,但是,它将是 4/8 字节的连续数组 MyClass 实例的引用 - 也就是说,MyClass 实例本身不会连续 -反过来又另一个对字符串的 4/8 字节引用,这也不会是连续的。

因此,有意义地使用 Member 意味着您几乎肯定会处理一些不连续的数据,但使用结构仍会为您节省一层间接访问。

关于C# 数据局部性 : reference type in an array of structs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com