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在做什么?有什么作用?

谢谢,万分感谢!!!

c++
D_DreKing
D_DreKing 按道理来看,CV_XADD应该是操作增加引用计数的。但是(int*)cstr - 1这个操作,我没看懂是怎么找到这个引用计数的。String类中只有两个成员变量啊。
12 个月之前 回复

1个回答

首先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的地址

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问