D_DreKing 2019-07-16 09:38 采纳率: 33.3%
浏览 550
已采纳

OpenCV3.4.0中String类构造函数使用的CV_XADD问题

String类由几个构造函数中使用了CV_XADD没看懂是干嘛的。
示例:

String(const String& s):cstr_(str.cstr_), len_(str.len_)

{

    if(cstr_)
            CV_XADD( ( (int*)cstr_ ) - 1, 1 ) ;

}

CV_XADD(int* addr, int delta){int tmp = *addr; *addr += delta; return tmp ;}

问题就是CV_XADD在做什么?有什么作用?

谢谢,万分感谢!!!

  • 写回答

1条回答 默认 最新

  • D_DreKing 2019-07-17 09:01
    关注

    首先String类中只有两个变量cstr_,len_。cstr就是指向buffer的指针,len_维护buffer的size。

    由于OpenCV中采用了share buffer来优化内存使用,当两个类中的cstr_的buffer内容相同时,会使得两个指针指向同一个buffer

    但是为了维护这个buffer,需要使用reference_count来维护该buffer。那么在该buffer第一次创建的时候,会在需要创建buffer的size上

    多开辟一个sizeof(int)字节的空间,这个多开辟的空间(buffer的前sizeof(int)字节)就用来当做reference_count。后面的空间作为cstr_指向的buffer空间
    所以CV_XADD就是用来操作reference_count的。(int*)cstr_ - 1就是指向了reference_count的地址

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 虚拟机打包apk出现错误
  • ¥30 最小化遗憾贪心算法上界
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝