为什么大于 128 的对齐方式会表现得很奇怪
Why do alignments greater than 128 act weird?
所以我一直在忙于编写自己的自定义内存分配器,但我遇到了一些我不理解的奇怪行为。
请考虑以下代码:
void* PointerUtil::AlignForward(void* address, const uint8_t& alignment)
{
return (void*)(((uintptr_t)(address) + (uintptr_t)(alignment - 1)) & (uintptr_t)(~(alignment - 1)));
}
这应该采用指针和对齐要求,并修改指针,使其在正向(正)方向上正确对齐。
但是,当我像这样测试时:
int address = 1240;
std::cout << (uintptr_t)memory::PointerUtil::AlignForward((void*)((uintptr_t)address), 512) << std::endl;
std::cout << (uintptr_t)memory::PointerUtil::AlignForward((void*)((uintptr_t)address), 256) << std::endl;
std::cout << (uintptr_t)memory::PointerUtil::AlignForward((void*)((uintptr_t)address), 128) << std::endl;
std::cout << (uintptr_t)memory::PointerUtil::AlignForward((void*)((uintptr_t)address), 64) << std::endl;
std::cout << (uintptr_t)memory::PointerUtil::AlignForward((void*)((uintptr_t)address), 32) << std::endl;
我得到的输出是这样的:
0
0
1280
1280
1248
这似乎不对。它应该是:
1536
1280
1280
1280
1248
这里出了什么问题?
您的对齐参数为 uint8_t
。uint8_t(256)
的价值是什么?
相关文章:
- 重载方法的方式会在使用临时调用时生成编译器错误
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- 为什么Visual Studio会以不同的方式对待我的对象
- 我应该使用无符号字符而不是 int 来存储永远不会大于 255 的值吗?
- 如果用户输入的输入大于 char 数组,则 cin.getline 会跳过输入提醒
- 编译器会秘密增加结构的对齐方式吗?
- C++标准是否保证 std::string::resize(new_size) 在new_size不大于旧标准时不会导致
- 向量下标出的范围错误.即使向量的索引大于访问数据的索引,也会发生误差
- 设置 A=B 会以某种方式弄乱 B 吗?(所有向量)C++
- 为什么我以前调用析构函数的方式会导致模因问题
- 字符串中的空格是否会改变程序解释它的方式
- 是否可以以编程方式创建迷你转储文件而不会崩溃?
- QT-写入SQL数据库时,空的qlineedits不会以null的方式传递
- 当运算符尝试输入大于变量可以包含的值>>会发生什么情况?
- 为什么ICC会以这种方式展开此循环并使用LEA进行算术
- 特定的测试案例不会以某种方式通过测试
- memmove会移动元素(就像前面的方式相同),还是一次抓住整个内存块
- C :创建大于大小的数组索引,不会引起错误
- 为什么大于 128 的对齐方式会表现得很奇怪
- 为什么更改我声明指向对象的指针的方式会导致如此多的分段错误?C++