本文转载自微信公众号「精益码农」,个奇怪作者小码甲 。引用转载本文请联系精益码农公众号。类型 开局两张图,个奇怪内容全靠刷。引用 马甲哥看到这样的类型现象,一开始还是个奇怪有点懵逼。 这个例子,引用string是类型纯粹的引用类型,但是个奇怪在函数传值时类似于值传递;我之前给前后示例的内存变化图吧: 根因就是大多数高级语言都把String设计成不可变的: 由一个字符串池管理字符串面值。 这个我还真的类型搜索了一下[1]: 总结起来: 既然pool里面共享字符面值,修改的时候又不能影响到别人,那就只好重新拷贝产生新的字符面值。亿华云 一个有意思的现象是:String虽然是引用类型,字符串对比时却表现的像值类型 正因为String不可变性 & Pool的机制,频繁变更字符串,会在池中产生很多临时的不用的字符串,所以我们有了优化的套路: 代表可变的字符串,一旦修改不会尝试创建新对象,而是动态扩展内存 Span该出圈了, Span提供对内存连续区域的类型安全访问,服务器托管该内存可以位于堆、堆栈、甚至是非托管内存; 与String不可变性相关的是ReadOnlySpan(值类型), 提供内存数据的只读视图,每次切片不会产生新对象,而是在已存在的连续空间上创造新的视图。 今天从两张诡异的编程图聊到了String的不可变性、内存分布, 延伸谈到了 String不可变性的设计设计考量(有先射箭再画靶的嫌疑??) 针对频繁修改的String如何做内存优化 不是自吹,文章内容在业界相当硬核(多次被各大佬/CSDN点赞/转载),阅读和关注不是目的,更希望得到更多的阅读反馈,互相促进认知的提升(相当真诚??)。 参考资料 [1]这个我还真的云服务器搜索了一下: https://www.c-sharpcorner.com/UploadFile/230635/why-string-are-immutable-in-dotnet/为什么被设计成不可变。引用
StringBuilder
Span
总结输出