OpenCV函數學習:alignPtr對齊指針

轉載地址:https://www.tuicool.com/articles/q2QrQr
在某些架構上,只有能被指定數(如4,16)整除的內存地址纔可以被訪問,不然程序會crash,或者出現錯誤的結果,或者數據的訪問變慢。
舉個例子來講,不少系統都要求interger的地址從偶數開始。opencv2.0以上版本不少指針都是被對齊過的,使指針地址可以被16整除。
opencv中的內存通常是經過malloc分配,不能保證都是都能被16整除,此時須要截斷,可是剩下的內存要如何維護? CV2.0的這樣維護的:在 malloc 是多申請一個指針的空間,這個指針指向 malloc 獲得的真實內存地址,只在 free 時使用它。對於指向任意地址的一個指針,OpenCV中能夠使用 **template < typename _Tp > _Tp* alignPtr ( _Tp* ptr , int n = sizeof ( _Tp ) ) ** 函數將其位移到後面最近的一個能整除n的地址,其中n必須是一個2的冪。架構

alignPtr 只有一行代碼,今天看了半天才懂。這一行代碼是:函數

template<typename _Tp> static inline _Tp* alignPtr(_Tp* ptr, int n=(int)sizeof(_Tp)) {
    return (_Tp*)(((size_t)ptr + n-1) & -n);
}

開始一直沒搞懂 & - n 是幹什麼,後來經大牛指點意識到n是2的冪,其二進制也就只有一個1,好比n默認爲16的時候爲00010000,補碼11101111,補碼加1爲負數,取負數獲得111110000,效果是對於2^k,獲得一個低k爲爲0,其餘位爲1的數,拿這個數(-n)和別的數作與操做,等於把別的數的低k位截沒了。這樣獲得的數必然是2^k的倍數(低k位爲0的數必然是2^k的倍數)。這一效果僅對n=2^k成立。ui

相關文章
相關標籤/搜索