【问题标题】:Are C# data type sizes fixed or variable?C# 数据类型大小是固定的还是可变的?
【发布时间】:2018-04-19 09:50:01
【问题描述】:

当引用 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

ab 是否仍然只占用 4 个字节的内存?字符串也一样吗?示例:

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

【问题讨论】:

  • 不,因为没有string.Max ot string.Min 存在。所以基本上对于值类型是,但对于像string这样的引用类型没有
  • 在 C# 中 string 是引用类型

标签: c# .net memory


【解决方案1】:

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

注意d 只是字符串的referencereference 采用固定大小。所以:cd 的大小相同,即使没有字符串:可能是 8 个字节或 4 个字节,具体取决于您是在 64 位还是 32 位上运行。然而,实际的string object 将是它在创建时分配的大小以适应内容。

请注意,“固定”并不意味着“提前知道和可预测”。对于很多类型,runtime/JIT根据执行环境来决定大小; IntPtr32Vector<T> 等 - 具有无法真正提前知道的大小,但 一旦知道:在应用程序执行期间是固定的。即使对于许多struct,填充等也可以在运行时确定。

【讨论】:

  • 感谢您的评论,我查看了string 的源代码,它存储了指向内存的m_firstChar 指针和一个字符串的length,并通过读取m_firstChar @ 来组装整个字符串987654335@ 字符数。
  • @tchelidze 实际上比这更复杂; m_firstChar 不是指针 - 它是 char。从本质上讲,这就是 first char 所在的位置 - 之后其他所有内容都是顺序的。字符串数据直接在对象中,而不是通过指针在外部。然后很多代码会使用&m_firstChar 来读取值,但这是一个interior 指针;数据仍然 100% 在对象内部。您几乎可以忽略数组和字符串的定义:运行时完全伪造它:)
  • @MarcGravell 这很有帮助,但是请您详细说明(或只是更新答案)关于“int”示例的更多信息?您的答案对于“字符串”和数组是明确的,但对于“int”是隐含的。
  • @GreggBursey “所有其他类型都是固定大小的。” (引自上文)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2013-05-26
  • 2021-06-25
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多