有个问题:
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 };
将是:
您也可以在内存布局中看到数值。
在 64 位中, header 的每个字段都占用 8 字节,因此 header 长度为 24 字节 因此整个数组的长度为 48 字节,并且变量指向数组:56 字节强>。
64位架构内存布局:
注意事项:
如果您的数组没有四舍五入到 8 字节,则会发生多次对齐,但不需要对齐。示例 (两个 1 大小的
int
数组):尽管头部的长度字段是 64 位的 8 字节,但它大于
.NET
允许的最大数组大小,因此仅可以使用 4 个。
请记住,这是一个实现细节,它可能会在 CLR 的实现/版本之间发生变化。
关于c# - 在 64 位处理器上为 3 Point 结构分配了多少字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39205406/