【发布时间】:2013-04-19 10:37:34
【问题描述】:
其实我很想知道下面的数据类型消耗了多少内存
整数? = 内存大小?
双倍? = 内存大小?
布尔值? = 内存大小?
谁能给我关于他们的存储或计算他们大小的方法的信息
【问题讨论】:
-
它没有得到正确的答案,必须有一个准确的答案,每个人只需复制并粘贴来自不同博客的答案。事件他们不
其实我很想知道下面的数据类型消耗了多少内存
整数? = 内存大小?
双倍? = 内存大小?
布尔值? = 内存大小?
谁能给我关于他们的存储或计算他们大小的方法的信息
【问题讨论】:
我相信答案是here
基本上,将布尔值的大小添加到不可为空的大小。
【讨论】:
您可以使用以下代码在运行时获取实际大小。返回的值将与数组int?[] 的元素对齐方式相同,这与CLI 的sizeof 操作码(ECMA-335 Partition I,§8.9.1)返回的值一致。由于可空类型被视为引用类型,因此 C# sizeof 运算符不能用于此目的,即使在不安全的上下文中也是如此。相反,我们使用TypedReference 和一个 2 元素数组来计算相同的信息。
public static int SizeOf<T>()
{
T[] array = new T[2];
TypedReference elem1 = __makeref(array[0]);
TypedReference elem2 = __makeref(array[1]);
unsafe
{
byte* address1 = (byte*)*(IntPtr*)(&elem1);
byte* address2 = (byte*)*(IntPtr*)(&elem2);
return (int)(address2 - address1);
}
}
然后您可以使用以下内容。
// This returns 8 on my test, but the runtime is free to change this to
// any value greater than sizeof(int)+sizeof(bool)
int nullableSize = sizeof(int?);
【讨论】:
你想知道例如的内存消耗吗? int? x? MSDN 说:
...公共语言运行时根据 应用程序所在平台的特征 执行。在某些情况下,它会将您声明的元素打包为 尽可能紧密地结合在一起;在其他情况下,它会对齐他们的记忆 地址到自然硬件边界。此外,存储分配是 在 64 位平台上与在 32 位平台上不同。
同样的注意事项适用于复合数据类型的每个成员 例如结构或数组。此外,一些复合类型 有额外的内存要求。例如,一个数组使用额外的 数组本身以及每个维度的内存。在 32 位 平台,这个开销目前是 12 个字节加上每个 8 个字节 方面。在 64 位平台上,要求翻倍。你不能 依靠简单地将标称存储分配相加 组件。
引用任何基本或复合数据类型的对象使用 4 除了数据类型中包含的数据之外的字节。
【讨论】: