使用intptr_t进行一些算术计算

时间:2018-11-29 07:15:08

标签: c++

我想在分配内存(在arm64中)时保持内存地址为16字节对齐

当我分配空间时,我得到一个地址:

char * addr = (char*)malloc(1024);

那么addr可能不是16的倍数!所以我想做一些算术运算:

uintptr_t ip = reinterpret_cast<uintptr_t>(addr);
ip = (ip / 16) * 16; // here ip is Multiple of 16.

那么我如何将ip投射到内存地址?使用(char *)或(void *)

char * newIP = reinterpret_cast<char*> (ip) // is this right?

Thess是没有bug的方法吗?那便携式的呢?

2 个答案:

答案 0 :(得分:0)

该地址是通过内存分配返回的,因此您无法将其与低位地址方向对齐。当地址未对齐时,可以在开始时丢弃一些字节。 像这样:

size_t unit_ = 16;
size_t cbSize_desired = 1024;
void* addr = malloc(cbSize_desired + unit_ - 1);
uintptr_t ip = reinterpret_cast<uintptr_t>(addr);
char* newIP = reinterpret_cast<char*>((ip + unit_ - 1) / unit_ * unit_);

答案 1 :(得分:0)

void *addr = malloc(1024+15);
void *newIP = ((uintptr_t)addr+15) & ~ (uintptr_t)0x0F;

再次对内存收费时,请确保释放原始的地址指针!