首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

String是一个奇怪的引用类型

这个例子,string是纯粹的引用类型,但是在函数传值时类似于值传递;我之前给前后示例的内存变化图吧: 根因就是大多数高级语言都把String设计成不可变的: 由一个字符串池管理字符串面值。...这个我还真的搜索了一下[1]: 总结起来: string 被设计为不可变, 是因为 string在现代任何语言中,使用很频繁:多个对象可能都是这个字符面值, 然后就设计一个Pool来存储string。...一个有意思的现象是:String虽然是引用类型,字符串对比时却表现的像值类型 string str1="FooFoo"; string strFoo="Foo"; string str2= strFoo...,该内存可以位于堆、堆栈、甚至是非托管内存; 与String不可变性相关的是ReadOnlySpan(值类型), 提供内存数据的只读视图,每次切片不会产生新对象,而是在已存在的连续空间上创造新的视图。...String的不可变性、内存分布, 延伸谈到了 String不可变性的设计设计考量(有先射箭再画靶的嫌疑☺️) 针对频繁修改的String如何做内存优化 不是自吹,文章内容在业界相当硬核(多次被各大佬/

37230

String是一个奇怪的引用类型

马甲哥看到这样的现象,一开始还是有点懵逼。 这个例子,string是纯粹的引用类型,但是在函数传值时类似于值传递;我之前给前后示例的内存变化图吧: ?...根因就是大多数高级语言都把String设计成不可变的: 由一个字符串池管理字符串面值。 为什么被设计成不可变。...这个我还真的搜索了一下[1]: 总结起来: string 被设计为不可变, 是因为 string在现代任何语言中,使用很频繁:多个对象可能都是这个字符面值, 然后就设计一个Pool来存储string。...一个有意思的现象是:String虽然是引用类型,字符串对比时却表现的像值类型 string str1="FooFoo"; string strFoo="Foo"; string str2= strFoo...总结输出 今天从两张诡异的编程图聊到了String的不可变性、内存分布, 延伸谈到了 String不可变性的设计设计考量(有先射箭再画靶的嫌疑☺️) 针对频繁修改的String如何做内存优化 不是自吹,

63920
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    TypeScript 类型系统中一个巧妙的设计

    或许大家看来,像这样定义 Object.keys 似乎是理所当然的事情,但 TypeScript 不这样做其实是有自己的考虑的,这就跟 TypeScript 的结构类型系统有关。...TypeScript 中的结构类型 当一个对象的属性丢失或类型错误时,TypeScript 会抛出错误。...但是,如果我们多提供了一个额外的属性,TypeScript 就不会报错。...这里面的关键点就是:当我们拥有一个 T 类型的对象时,我们所知道的关于这个对象的一切就是它至少包含 T 中的所有属性。...利用结构类型 结构类型给我们提供了很大的灵活性,它允许接口准确地声明它们需要的属性。 下面我们再来举一个例子。 假如我们编写了一个函数,来解析键盘事件并返回要触发的快捷方式。

    26230

    探索类型系统的底层 - 自己实现一个 TypeScript(硬核干货)

    在进一步讨论之前,我们需要快速了解一下 JavaScript 编译器中的一个重要机制 AST。 关于 AST 详细介绍请看这篇文章。 AST 的意思是抽象语法树 ,它是一个表示程序代码的节点树。...的概念,这些命名声明将 AST 中的声明节点与其他声明进行连接,从而形成相同的实体。...我觉得这给出了一个非常强大的 idea,即在如此多的不同场景中检查如此多的不同类型是多么的复杂和困难。 类型检查器不依赖于调用代码,即如果一个文件中的任何代码被执行(例如,在运行时)。...我们将其限制在三个场景中的原因是,我们可以关注每一个场景中的具体机制,并希望到最后能够对如何引入更复杂的类型检查有一个更好的构思。 我们将在编译器中使用函数声明和表达式(调用该函数)。...最后返回一个 programmast,它是一个包含两个 AST 块的程序。 在AST中,您可以看到参数标识符 a 上的 typeAnnotation,与它在代码中的位置相匹配。

    1.3K40

    SAP RETAIL 我的第一个寄售类型的跨公司采购订单

    SAP RETAIL 我的第一个寄售类型的跨公司采购订单 笔者所关注的一个零售行业项目里,存在总公司进口商品后,转给国内的销售公司,然后再由销售公司的门店销售给客户的场景。...不过这个项目特殊的地方在于销售公司从总公司采购的商品,采取的是寄售模式,即使说这是一个供应商寄售模式的公司间STO。 这对于笔者而言,是一个新的场景,引起了笔者的好奇。...求知欲望驱使下,笔者在一个SAP RETAIL的SAP测试系统上,实现了这种供应商寄售模式的公司间STO功能。 本文就是对这个流程在SAP系统上的实现,做一个阐述。...2,指定发货工厂对应的STO单据类型。...NMI1和NMI2之间是公司内转储,故使用UB单据类型。 NM01/NM02/NM03/NMDC是零售销售公司下的门店。

    98620

    2018年Go语言实战笔记1含着金钥匙出生的gogo环境搭建第一个go程序变量常量数据类型值类型与引用类型小结

    darwin/amd64 关于编辑器,推荐使用jetbrains出品的golang 第一个go程序 按照官网的demo,运行第一个go程序 新建hello.go文件 package main import...变量声明后不用 对于从其他语言转过来的程序员,一开始会不习惯go的霸道规定,尤其是我大PHP程序员。...命名规则 变量的命名规则:以字母或下划线开头,对大小写敏感。不能使用go的保留关键字 ? go保留关键字 作用域 在代码块声明的变量,只在块内有效 ?...变量的类型不能更改,广大PHP开发者要谨记了,PHP是弱类型语言,同一个变量,可以随时切换存储的数据类型。PHP的变量不好比是一个万能的筐,什么都可以装。...值类型与引用类型 值类型:变量存储的是数据本身,如基本数据类型:字符串,布尔型,数字等 引用类型:变量存储的是数据所在的内存地址,如:指针,map, chan等 package main import

    41210

    现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)

    前言 最近有朋友问我这么一个面试题目: 现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。...Bloom Filter 基于上面分析的条件,要实现这个需求最需要解决的是如何将庞大的数据 load 到内存中。...Bloom Filter 原理 下面来分析下它的实现原理。 官方的说法是:它是一个保存了很长的二级制向量,同时结合 Hash 函数实现的。 听起来比较绕,但是通过一个图就比较容易理解了。 ?...观察 GC 日志会发现没有一次 fullGC,同时老年代的使用率很低。和刚才的一对比这里明显的要好上很多,也可以写入更多的数据。 源码分析 那就来看看 Guava 它是如何实现的。...构造方法中有两个比较重要的参数,一个是预计存放多少数据,一个是可以接受的误报率。 我这里的测试 demo 分别是 1000W 以及 0.01。 ?

    67320

    如何描述一个bug 如何定义bug的类型级别 bug的生命周期

    描述一个bug 提交了如下bug: 1、在短信列表,选择一条短信,进行删除,删除失败 2、在短信列表,选择一条短信,进行查看,在查看页面,进行删除,删除失败 故障发现版本:VPS20180226...定义一个bug的严重程度 每个公司的要求都不同,这里只是提供一个参考 Blocker(崩溃): 阻碍开发或测试工作的问题;造成系统崩溃、死机、死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失...,应及时处理) 3. bug的生命周期 ● New:新发现的Bug,未经评审决定是否指派给开发人员进行修改。...● Open:确认是Bug,并且认为需要进行修改,指派给相应的开发人员。 ● Fixed:开发人员进行修改后标识成修改状态,有待测试人员的回归测试验证。...● Closed:修改状态的Bug经测试人员的回归测试验证通过,则关闭Bug。 ● Reopen:如果经验证Bug仍然存在,则需要重新打开Bug,开发人员重新修改。

    80220

    go语言中一个典型的引用类型的数据使用案例的注意点-日常实战总结no.5

    引用类型:由类型的实际值引用(类似于指针)表示的数据类型。 go里面的指针、map、slice、chan是引用类型。 go里面的int、string、struct是非引用类型。...,所以go的非引用类型是值传递。...---- 下面我们来讲一下事例,可能我们了解这样的理论之后,在简单平常的使用中可能遇到的问题会比较少,但遇到复杂的逻辑之后就可能会遇到一些问题。 下面我们列下我实际业务中遇到的一个问题。...是引用类型   //go本身的值传递,但是map是引用类型,所以会造成这样的问题   m := make(map[string]bool)   m["a"] = true   m["b"] = true...map的值,其实第一次循环我想用传进来的值,第二次循环还是想用我传进来的值,但是因为map是引用类型,造成第二次循环的值受第一次循环的影响,这个时候我们要解决此类问题,我们就需要使用深度复制来解决此类问题

    24920

    .NETC# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)

    .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法) 发布于 2018-09-02 14:27...思路 既然唯一的输入对应唯一的输出,那么我们可以通过一个字典来储存我们已经转换过的输出。 // 其中 TSource 表示输入的类型,TCache 表示输出的类型。...为了通用一点,我设计一个类型 CachePool: namespace Walterlv { public sealed class CachePool的阅读,我把实际的代码放到了最后。 用法 高性能创建对象 比如你认为反射创建对象是一个耗时的操作,那么可以将构造函数的调用创建成一个委托,然后把这个委托缓存下来。...如何快速编写和调试 Emit 生成 IL 的代码 一文中创建了可以为属性赋值的委托,你也可以使用此方法将委托缓存下来,以便每次给相同类型的相同属性赋值时能有不那么差的性能。

    2.4K10

    TypeScript 官方手册翻译计划【二】:普通类型

    当一个函数出现在某个地方,且 TypeScript 可以推断它是如何被调用的时候,该函数的参数会被自动分配类型。...既然我们已经知道了如何编写基本的类型,是时候开始用一种有趣的方式将它们结合起来了。 定义一个联合类型 第一种结合类型的方式就是使用联合类型。...类型别名 目前为止,我们都是在类型注解中直接使用对象类型或者联合类型的。这很方便,但通常情况下,我们更希望通过一个单独的名字多次引用某个类型。...,这个例子也可以正常运行,它的效果和直接使用一个匿名对象类型一样。...枚举 枚举是 TypeScript 添加到 JavaScript 中的一项特性。它允许描述一个值,该值可以是一组可能的命名常量中的一个。

    2.3K20

    C++核心准则R.36: 使用const shared_ptr&类型参数表示可能持有一个对象的引用计数

    R.36: 使用const shared_ptr&类型参数表示可能持有一个对象的引用计数。 Reason(原因) This makes the function's ???...这样可以使函数的行为更明确。...(简单)如果一个函数以左值引用方式使用了Shared_pointer参数,却没有在任何一条代码路径上对它赋值或者调用reset(),提出警告并建议改用T* 或者 T& 代替。...(简单)((基本))如果一个函数以传值或者常量引用方式使用了Shared_pointer参数,却没有在任何一条代码路径上拷贝它或者移动它,提出警告并建议改用T* 或者 T& 代替。...(简单)((基本))如果一个函数以右值引用方式使用了Shared_pointer参数,建议改用传值方式。

    1.1K20

    天天都在用的 Nginx,可你知道如何用一个反向代理实现多个不同类型的后端网站访问吗?

    断断续续一个月迁移完成大概优化掉了 1/3 的机器,完成之后遇到了一些问题,比如:曾经零零散散部署在生产上一些可视化 UI:Apollo、Kibana、Grafana、Jenkins 等等服务,这些服务都采用了...用 Nginx 做反向代理 为了解决这两个问题,自然第一反应想到的就是使用反向代理,我的理想构思下应该是下图这样的。 ?...比较好的策略应该是让 Nginx 来判断当前的 Host 是什么来决定跳转到哪一个后端的 Webserver 上,比如: a.mip.com 就跳转到 Apollo,j.mip.com 就跳转到 Jenkins...一个完整的演示实例 为了实现上面的需求,在 Nginx 中你完全可以使用 Rewrite 模块下 if 指令来完成。...# root html; # index index.html index.htm; # } #} } 至此,我们就演示完了一个反向代理实现多个不同类型的后端网站访问的场景

    3.8K31

    TypeScript 简介及编码规范

    TypeScript 是什么 TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程。...通常这会发生在你清楚地知道一个实体具有比它现有类型更确切的类型。 通过类型断言这种方式可以告诉编译器,”相信我,我知道自己在干什么”。类型断言好比其他语言里的类型转换,但是不进行特殊的数据检查和解构。...let {name, ...rest} = person; TypeScript Interface 在面向对象语言中,接口(Interfaces)是一个很重要的概念,它是对行为的抽象,而具体如何行动需要由类...TypeScript 中的接口是一个非常灵活的概念,除了可用于对类的一部分行为进行抽象以外,也常用于对「对象的形状(Shape)」进行描述。...指的是一个类 (称为子类、子接口) 继承另外的一个类 (称为父类、父接口) 的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;继承是一种 is-a 关系。 ?

    10.6K40
    领券