当引用Jon Skeet撰写的this文章时,我发现在C#中,int
将是4个字节的内存,而struct
是这样的:
struct PairOfInts
{
public int a;
public int b;
}
总计8字节的内存,因为:
内存插槽大到足以包含两个整数(因此它必须是8个字节)。
所以,如果我们有这个:
public int a = 0;
public int b = 2147483647; //the max allowed for an int
a
和b
仍然只占用4个字节的内存吗?字符串也一样吗?例如:
public string c = "";
public string d = "somethingreallyreallylong";
答案 0 :(得分:3)
.NET中有两种类型绝对忽略"固定大小"规则:string
和数组(int[]
,SomeType[,,]
等)。字符串和数组的大小适合于构造中声明的内容 ;构建后,每个实例都是固定大小的。所有其他类型都是固定大小。
请注意,d
只是字符串的引用,引用采用固定大小。因此:c
和d
的大小相同,即使没有字符串:可能是8个字节或4个字节,具体取决于您是在64位还是32位上运行。但是,实际的string
对象将是创建它以适合内容时的分配大小。
请注意"已修复"并不意味着提前知道和预测"。对于许多类型,运行时/ JIT根据执行环境决定大小; IntPtr32
,Vector<T>
等 - 具有事先无法真正知道的大小,但一旦知道:在应用程序执行期间是固定的。即使对于许多struct
,也可以在运行时确定填充等。