gpt4 book ai didi

c# - 在 64 位处理器上为 3 Point 结构分配了多少字节?

转载 作者:IT王子 更新时间:2023-10-28 23:29:16 26 4
gpt4 key购买 nike

有个问题:

Given:

struct Point {int x; int y;}
var p = new Point[3]

how many bytes of memory will be allocated in stack and in heap if we use a 64-bit processor?

.Net 的正确答案是 44。谁能解释一下这个数字是怎么出现的?

据我了解,p 将在 x64 的堆栈中占用 8 个字节

每个结构都有两个 Int32 值,因此p.Length * sizeof(Point)3 * 8 = 24 字节堆中的数组。

这将是 32 字节。在这种情况下,剩下的 12 个字节 是什么?

最佳答案

您对 44 字节 的回答可能是对 32 位架构数组的混淆。

.Net (32 位):

  • 每个 object 包含 4 个字节 用于同步(lock (obj))。
  • 每个 object 都包含 4 个字节 的类型标记。
  • 每个 数组 包含 4 个字节 的长度。

如你所说,指针是 8 个字节

这与数组本身的 24 字节 为您提供 44 字节


然而,这是 32 位的标题布局。

可以看到,如下代码的内存布局:

var p = new Point[3];
p[0] = new Point { x = 1, y = 2 };
p[1] = new Point { x = 3, y = 4 };
p[2] = new Point { x = 5, y = 6 };

var p2 = new Point[3];
p2[0] = new Point { x = 8, y = 8 };
p2[1] = new Point { x = 8, y = 8 };
p2[2] = new Point { x = 8, y = 8 };

将是:

Memory layout

您也可以在内存布局中看到数值。


在 64 位中, header 的每个字段都占用 8 字节,因此 header 长度为 24 字节 因此整个数组的长度为 48 字节,并且变量指向数组:56 字节

64位架构内存布局:

64 bit memory layout


注意事项:

  • 如果您的数组没有四舍五入到 8 字节,则会发生多次对齐,但不需要对齐。示例 (两个 1 大小的 int 数组):

    Alignment

  • 尽管头部的长度字段是 64 位的 8 字节,但它大于 .NET 允许的最大数组大小,因此仅可以使用 4 个。

请记住,这是一个实现细节,它可能会在 CLR 的实现/版本之间发生变化。

关于c# - 在 64 位处理器上为 3 Point 结构分配了多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205406/

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