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

标签 c# .net arrays memory struct

有个问题:

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/

相关文章:

c# - String.Format 扩展方法

c# - 如何检查 XElement 是否有任何子节点?

c# - 在 ASP.NET MVC 中路由到 Root View

c# - 如何在不安装 Microsoft Lync 的情况下在我的业务应用程序中创建自定义 Lync 客户端?

C#:在计算机中创建虚拟驱动器

javascript - 在只有类、没有 ID 的 div 中获取特定的 <p>

c# - 为 Web API 1、.net 4.0 启用 CORS 时出现问题

c# - 3层架构——层与层之间传递数据

c++ - 生成随机数并将它们放入数组中

javascript - 我想写一个可以生成随机地址的脚本