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 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示
  • ¥15 扫描项目中发现AndroidOS.Agent、Android/SmsThief.LI!tr
  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译