Так что я был занят, пытаясь написать свои собственные специализированные распределители памяти, но я столкнулся с каким-то странным поведением, которое я не понимаю.Почему выравнивания больше 128 действуют странно?
Рассмотрим этот код:
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
Что здесь не так?
считать передачу по значению - передача по ссылке скорее всего будет пессимизацией для объектов, меньших, чем указатели. –