我已经阅读了不少数据位置帖子,但没有找到答案:如果我创建一个结构数组以便有一个连续的内存块(让我们说MyStruct,是由值类型组成),然后在我的MyStruct中添加一个字符串,在哪里分配字符串?简而言之,声明为结构成员的引用类型(数组中的项)是否可以很好地获取缓存行?或者我最终获取一个引用,然后必须找到它,这首先打破了创建结构数组的整个目的?
我相信我的措辞正确,但我发现它有点滑。
感谢您的时间。
编辑:我意识到字符串是在堆上分配的,只是想知道连续的方面......
答案 0 :(得分:1)
假设:
struct MyStruct { string Member; }
class MyClass { string Member; }
MyStruct []将具有与string []几乎相同的布局 - 也就是说,您有一个连续的4/8字节引用字符串实例的数组,您可以将其作为例如与object.ReferenceEquals(...)进行比较,不触及非连续数据。然而,字符串实例本身 - 有关长度,散列,字符,香草等式的数据(因为字符串重载==就这些事情而言)等等 - 不是这个连续块的一部分,因为字符串是引用类型。
这仍然比MyClass []更好,但是,它将是一个连续的4/8字节引用 MyClass实例的数组 - 也就是说,MyClass实例本身不会是连续的 - 反过来,另一个 4/8字节引用字符串,也不会是连续的。
因此,有意义地使用Member意味着您几乎肯定会处理一些非连续数据,但使用结构仍然会为您节省一层间接。
答案 1 :(得分:0)
引用类型始终作为独立对象在堆上分配。他们从未被内联到别的东西。
类型作者选择分配样式和类型用户别无选择。这是因为实现通常取决于分配语义。如果你强迫它们像结构一样运行,很多类都无法正常工作。