隐式共享(Implicit Sharing)

今天学习QT编程,看到了隐式共享的编程思想,看完后收获颇丰富,因此有感而写一篇文章记录下来。
隐式共享(Implicit Sharing)又称为写时复制(copy-on-write)。采用隐式共享的目的是尽可能地提高资源使用率和减少复制操作。下面通过代码来体现其设计的高效性。

QPixmap p1,p2;
p1.load("img.png");
p2= p1;
QPainter paint;
paint.begin(&p2);
paint.drawText(0,50,"Hi");
paint.end();

QPixmap 采用的是隐式共享。共享类包含了一个指向共享数据块的指针和数据组成,在共享数据块中包含了一个引用计数。首先QPixmap 创建两个字符串对象p1,p2。p1,p2的引用计数被初始化为1。
引用计数的运算规则:每当有新的对象引用了共享数据时会进行加一递增,而当有对象不再引用该共享数据时,引用计数会减一递减。当引用计数为0时,这个共享数据就会被销毁。
在这里p1,p2的引用计数为1,程序执行到p2 = p1之后,p2和p1就共享同一个数据。p1的引用计数为2,p2的引用计数为0,所以p2以前指向的内存被销毁。
p2 = p1同时还进行了浅拷贝(将p1的引用传递给p2)。而当一个对象被修改时如paint.begin(&p2)是深拷贝。
隐式共享在后台进行,在实际编程中一般不需要去关注它。QT中采用隐式共享的类还包括:
QByteArray、QCursor、QFont、QPixmap、QString、QVariant和所有的容器类

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spark中,隐式转换是一种特性,可以将一种类型自动转换为另一种类型,以便在编代码更加方便。Spark中的隐式转换通过隐式值、隐式对象、隐式方法和隐式类来实现。在RDD类的伴生对象中,有一个隐式转换方法`rddToPairRDDFunctions`,将RDD转换为PairRDDFunctions类,从而为RDD添加了aggregateByKey()、reduceByKey()、join()等方法。这些方法在RDD类本身并没有定义,使用隐式转换可以让我们在代码中使用这些方法来操作RDD。 此外,在Scala中寻找隐式定义的过程是通过在当前代码作用域中查找隐式定义,如果找不到则检查与类型相关的伴生对象、继承或实现的类、特征等的伴生对象、包含类型的参数化类型的伴生对象以及外部类的伴生对象。只要找到合适的隐式定义,就会应用于代码中。 需要注意的是,隐式值、隐式对象的名称并不重要,重要的是它们的类型。如果同定义了多个相同类型的隐式值,就会出现二义性,编译器无法确定使用哪一个。因此,在使用隐式转换,需要避免出现二义性的情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [透过Spark源码浅谈Scala隐式implicit)机制](https://blog.csdn.net/nazeniwaresakini/article/details/104814444)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值