我想在分配内存(在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的方法吗?那便携式的呢?
答案 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;
再次对内存收费时,请确保释放原始的地址指针!