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在做什么?有什么作用?
谢谢,万分感谢!!!
答
首先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的地址