Thursday, April 15, 2010

Learning OpenCV: Memory Storage in OpenCV

ข้ามมาว่ากันด้วยเรื่อง memory storage กันดีกว่า OpenCV มี dynamic object
ที่เรียกว่า memory storage ซึ่งก็คือ linked lists(ไม่เคยใช้ตั้งแต่จบ data structure ตอนปีสอง) ที่จะ allocate, de-allocate memory block เนื่องจากใน OpenCV
เองมีส่วนการทำงานที่ต้องใช้ memory ส่วนนี้อยู่หลายคำสั่ง คำสั่งที่เกี่ยวกับ memory storage มีประมาณนี้

cvMemStorage* cvCreateMemStorage(int block_size = 0);
void cvReleaseMemStorage(CvMemStorage** storage);
void cvClearMemStorage(CvMemStorage* storage);
void* cvMemStorageAlloc(CvMemStorage* storage,size_t size)

เราใช้คำสั่ง cvMemStorage ในการสร้าง linked list โดยกำหนดขนาด block ของ memory ซึ่งคิดว่าค่า default ที่กำหนดให้ขนาด block = 64k น่าจะโอเค (เพราะไม่มีความรู้ด้านนี้ 555) หลังจบก็ใช้คำสั่ง cvReleaseMemStorage ตาม step การ alloc, dealloc ใน C

มีอย่างหนึ่งที่น่าสังเกตคือคำสั่ง cvClearMemStorage ที่จะช่วยคืนพื้นที่ที่สร้างขึ้นจากคำสั่ง cvCreateMemStorage นี้ เพราะว่าการลบ object ใดๆ ที่อยู่ในพื้นที่นี้ (object เหล่านี้จะเกิดขึ้นในบางฟังก์ชันของ OpenCV เช่น sequences ที่จะกล่าวถึง) จะเป็นการลบ object นั้นทิ้งไปเท่านั้นไม่ได้คืนพื้นที่หน่วยความจำ (ก็หน่วยความจำนี่ cvCreateMemStorage เป็นคนจองนี่ object ในนั้นก็ชี้ไปยังพื้นที่ในนั้น อีกอย่าง C ไม่มีการ garbage collection ด้วย)
ดังนั้นถ้าต้องการจะ recycle memory ก็ใช้คำสั่ง cvClearMemStorage ได้ (จะได้ใช้ถึงขั้นนั้นไหม)

ส่วนคำสั่งสุดท้ายคือ cvMemStorageAlloc เป็นจองเนื้อที่ในหน่วยความจำที่อยู่ใน storage (ยังไม่รู้เลยว่าจะใช้ตอนไหน)

No comments:

Post a Comment