c# - C# 16 字节结构限制是否意味着我不能在结构中使用字符串?

标签 c# string struct

我有一个结构:

public struct MyStruct
{
    public readonly string Str1;
    public readonly string Str2;
}

根据 Internet,如果结构的大小不超过 16 字节,您真的应该只使用它们。如果更多,可能会发生性能问题。从各种搜索中,字符串每个字符存储 2 个字节。这意味着如果你在结构中有一个字符串,它最多只能有 8 个字符,假设它是你的结构中唯一的字符串。在我的示例中,这将在我拥有的两个字段之间进行拆分。

然而,在其他地方,我读到只有字符串引用被放入结构中,而不是字符串本身。

我的问题是:C# 结构的 16 字节推荐/限制是否意味着我基本上不能在其中使用字符串。我有时喜欢利用结构(尤其是它的不能为空的部分),所以我想知道在遵循建议的同时是否仍然可以使用它们。

编辑:我选词不当。事实上,这不是语言的限制,而是基于性能的建议,在一个结构中不超过 16 个字节。我认为我在这里成为过早优化的受害者:如果我在我的应用程序中看到实际性能问题,而不是为少量字节烦恼,也许我应该只担心这个限制。

最佳答案

有关 16 字节阈值的建议应被视为已过时。 .NET Runtime 优化了特定大小以下结构的操作(过去是 16 个字节,但后来增加到我认为的 24 个字节);当结构超过该大小时,每字节的成本会增加,但这并不意味着应该为大于该大小的所有内容使用一个类。

创建新结构的成本与其大小成正比。创建新类对象的成本与其大小加上一些显着的额外开销成正比。复制现有结构的成本与其大小成正比,对超过一定大小的结构有惩罚。复制对不可变类对象的引用的成本是固定的且很小。

创建任意大小的结构并复制一次或两次总是比创建相同大小的类对象并同样复制引用更便宜。如果结构或类引用将被复制数百万次,即使是 12 字节的类也可能优于 12 字节的结构。对于介于两者之间的值,类与结构的盈亏平衡大小将取决于结构或类引用被复制的次数,但除非类型真的很大或将被复制数千次,否则额外的成本复制结构仍然比创建类对象的额外成本更便宜。

关于结构包含字符串这一事实,人们应该将对不可变类型对象的引用视为在 32 位或 64 位系统上具有 4 或 8 个字节的成本。由于 string 字段不“保存”一个字符串,而只是标识一个字符串,因此具有两个 string 字段的结构将占用 8 或 16 个字节,无论由此识别的字符串的长度如何。

关于c# - C# 16 字节结构限制是否意味着我不能在结构中使用字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24701472/

相关文章:

c# - 异步管家模式 (Netmq)

c# - 工厂模式,按属性选择

python - 将字符串列表写入 csv

指向结构的指针的 C typedef

c# - 编写 Visual Studio 插件?

C# 是否有一个类似 .NET 3.5 的 mockito 的 spy 框架?

C++ <algorithm> 替换所有不工作的事件

C 读取文件到动态列表、动态字符串

c - 定义一个结构,其中一个成员指向另一个成员

c# - 如何为 C# 包装具有多种类型的 C++ 结构?