坚持理解记忆对齐
stuck on understanding memory alignment
分配包含width * height
图像的内存的代码如下:
const size_t alignment = 64;
size_t space = width * height * bytes_per_pixel + alignment;
rawdata = new unsigned char[space];
//typedef unsigned long int uintptr_t
uintptr_t ptr = reinterpret_cast<uintptr_t>(rawdata);
uintptr_t aligned = (ptr - 1u + alignment) & -alignment;
data = reinterpret_cast<unsigned char *>(aligned);
似乎 64 字节对齐是在rawdata
(即最初分配的内存)上执行的,这产生了由data
指向的对齐内存。但是,让我感到困惑的是这句话:
uintptr_t aligned = (ptr - 1u + alignment) & -alignment
谁能帮我?
该计算可确保地址与给定的数量对齐(必须是 2 的幂)。这意味着当对齐2^n
时,最低n
位必须为零。
让我们用二进制来做。假设我们得到一个随机指针在 16 字节对齐,而我们希望它以 64 字节对齐并计算。(这假设了两个的补码,顺便说一下,这不能保证,但事实上是标准):
address = ...1101010000
address - 1 -> ...1101001111
address + 64 -> ...1110001111
-alignment -> ...1111000000
address & -alignment -> ...1110000000
因此,实际上,它找到的最小值可以通过对齐整除,因为-alignment
所有位都低于对齐点为零。它还通过添加alignment-1
来确保它比原始指针大,这是-alignment
作为位的否定,即所有顶部位为零,但较低的位为一。
如果地址已经对齐怎么办?然后计算结果为原始指针,因为它的最低位为零,您将所有最低位设置为一,然后 AND 它们消失。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 如何记忆对齐派生类?
- 坚持理解记忆对齐
- 记忆对齐通常是如何进行的