c# - C# 数据类型大小是固定的还是可变的?

标签 c# .net memory

当引用this时Jon Skeet 的文章中,我发现在 C# 中,int 是 4 个字节的内存,struct 如下所示:

struct PairOfInts
{
    public int a;
    public int b;
}

总共需要 8 个字节的内存,因为:

The slot of memory is large enough to contain both integers (so it must be 8 bytes).

如果我们有这个:

public int a = 0;
public int b = 2147483647; //the max allowed for an int

ab 仍然各占用 4 个字节的内存吗?对于字符串来说也是如此吗?示例:

public string c = "";
public string d = "somethingreallyreallylong";

最佳答案

.NET 中有两种类型绝对忽略“固定大小”规则:string和数组( int[]SomeType[,,] 等)。字符串和数组分配的大小适合构造时声明的内容;一旦构造完毕,每个实例都是固定大小的。所有其他类型都是固定大小。

请注意d只是字符串的引用,并且引用采用固定大小。所以:cd即使没有字符串,它们的大小也相同:可能是 8 字节或 4 字节,具体取决于您运行的是 64 位还是 32 位。实际string但是,对象将是创建它时分配的任何大小以适应内容。

请注意,“固定”并不意味着“提前已知且可预测”。对于许多类型,运行时/JIT 根据执行环境决定大小; IntPtr32 , Vector<T>等 - 无法提前真正知道大小,但一旦知道:在应用程序执行期间是固定的。甚至对于许多人来说struct 、填充等可以在运行时确定。

关于c# - C# 数据类型大小是固定的还是可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49917960/

相关文章:

c# - 为什么这个 WPF 按钮背景在图像后面没有改变?

c# - 无法注册 IRelationalTypeMappingSource

c# - Rabin-Karp 算法用于使用滚动哈希实现抄袭

c# - 仅来自 boolean 值的 GetHashCode()

java - 有很多空对象会耗尽内存吗?如果是这样,是否有使用 ArrayDeque 作为队列的替代方法?

c# - 从数据库创建按钮 - 发生 System.NullReferenceException

.net - 如何为窗口的嵌套子项捕获 SourceUpdated?

c# - 我应该先在 EF 代码中映射双向关系的两侧吗?

java - 正确处理大量对象

memory - Rust 用什么代替垃圾收集器?