C#数据类型内存大小固定还是可变?含int、struct及string实例问询
嘿,这个问题问得挺关键的,咱们把这两个点分开说清楚:
一、int类型的内存占用:和值无关,固定4字节
不管你给int变量赋值为0、最大值2147483647,还是任何在int合法范围内的数值,它的内存占用始终是4字节(32位)。
原因很直观:int是值类型,它的内存大小是由C#语言规范直接定义死的——就是为了存储32位有符号整数而预留的固定空间。就像你买了个容量固定的小盒子,不管你装的是空的、满的,盒子本身的尺寸不会变。
你提到的PairOfInts结构体:
struct PairOfInts { public int a; public int b; }
它的总内存占用就是两个int的大小之和(8字节,默认场景下没有额外的内存对齐 padding),不管a和b存的是什么值,这个总大小都不会改变。
二、string类型的内存占用:和内容密切相关,分两部分算
string是引用类型,和值类型的int完全不一样,它的内存占用要拆成两部分看:
- 引用本身的大小:在32位进程里,这个引用占4字节;在64位进程里占8字节。这个引用就像一个“地址标签”,指向字符串实际内容存储的内存区域。
- 字符串实际内容的大小:C#里
string默认用UTF-16编码,每个字符占2字节。再加上字符串对象本身的基础开销(比如记录长度的字段、同步块索引等),实际内容的内存占用大概是「基础开销 + 字符数×2」字节。
举个例子:空字符串""也不是“零占用”,它作为一个合法的字符串对象,会占用基础开销的内存;而一个包含10个汉字的字符串,光内容部分就占20字节,再加上引用的大小,就是它整体的内存占用了。
内容的提问来源于stack exchange,提问作者Gregg Bursey




