2016-02-07 2 views
0

Так что я был занят, пытаясь написать свои собственные специализированные распределители памяти, но я столкнулся с каким-то странным поведением, которое я не понимаю.Почему выравнивания больше 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 

Что здесь не так?

+0

считать передачу по значению - передача по ссылке скорее всего будет пессимизацией для объектов, меньших, чем указатели. –

ответ

5

Ваш параметр выравнивания uint8_t. Какая ценность uint8_t(256)?

+2

Jeesh. Я идиот. Большое спасибо! –

Смежные вопросы