1. 程式人生 > >轉載:OpenCV中的對齊指針(alignPtr)

轉載:OpenCV中的對齊指針(alignPtr)

art 開始 程序 alloc 個數 sizeof 內存地址 申請 指向

轉載地址: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成立。

轉載:OpenCV中的對齊指針(alignPtr)