计算以前对齐的地址
Computing Previously Aligned Address
要获得下一个对齐的地址,给定一个指针和一个对齐方式,请使用:
inline int OffsetRequiredForAlignment( uintptr_t address_p, int alignment_p ){
uintptr_t mask = alignment_p - 1;
uintptr_t amountMisaligned = (address_p & mask );
int offset = (int)(alignment_p - amountMisaligned);
if( offset == alignment_p ) offset = 0;
return offset;
}
或者是某种变体。如何计算上一个对齐的地址?
下一个对齐的地址是address_p + offset
。上一个对齐的地址是address_p - amountMisaligned
。
此外,偏移量可能为:
int offset = (alignment_p - int(amountMisaligned)) & int(mask);
然后可以消除if语句。
相关文章:
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 内存地址是否由于未对齐的内存地址而损坏?
- 计算以前对齐的地址
- 对象地址是否保证是其类型对齐的倍数
- 数据对齐:限制内存地址为数据类型大小倍数的原因
- 安置新的地址对齐
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 将地址向前对齐
- 编译器如何知道物理地址的对齐方式
- x86-64上检查指针范围是否跨越N字节对齐地址的最快方法
- MOVAPS 访问未对齐的地址
- CUDA 在推力device_vector调整大小时地址未对齐
- 做 malloc 和 new 返回一个 int 对齐的地址
- 内存地址的数字表示和对齐之间的关系
- 如何将地址对齐到一个void指针
- 为什么数据断点不能在未对齐的地址上工作
- 如何确定地址是否与缓存对齐
- C++变量地址和对齐方式 |x86
- 查找下一个对齐的内存地址