OpenCV函数学习:alignPtr对齐指针

本文探讨了在OpenCV中确保内存地址能被特定数值(如16)整除的重要性,以提高数据访问效率和避免错误。介绍了alignPtr函数的工作原理,通过位运算实现内存地址的对齐。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载地址: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成立。

转载于:https://www.cnblogs.com/langzou/p/9758993.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值