使用 intptr_t 做一些算术运算

Posted

技术标签:

【中文标题】使用 intptr_t 做一些算术运算【英文标题】:Use intptr_t to do some arithmetic computing 【发布时间】:2018-11-29 07:15:08 【问题描述】:

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

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

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?

论文是没有错误的方法吗?便携呢?

【问题讨论】:

首先不要在 C++ 中使用malloc,即使只是分配一大块字节也不行。这是一个坏习惯,您应该改用new[](我通常会推荐std::vector,但您的对齐要求会阻止这种情况)。其次,不要忘记在分配的数量上至少增加 15 个字节,因为您的算法会丢弃部分内存。最后,保留您收到的原始指针,因为您在释放内存时需要它。 我想你可能是looking for std::align,但我不确定能否将其转化为答案。而且由于它基本上是指向与此评论相同的文档页面的链接,因此我不确定这是否是一个好的答案。 @某程序员老兄嗨某程序员老兄。谢谢你的提议,确实很重要。但是代码片段只是一个简化我的问题的例子。我想知道这个演员表是否有问题。 嗨 user4581301 @user4581301 谢谢你的建议,我也会试试 std::align 【参考方案1】:

地址是通过内存分配返回的,所以你不能将它对齐到低地址方向。当地址未对齐时,您可以在开头丢弃一些字节; 像这样:

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_);

【讨论】:

【参考方案2】:
void *addr = malloc(1024+15);
void *newIP = ((uintptr_t)addr+15) & ~ (uintptr_t)0x0F;

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

【讨论】:

以上是关于使用 intptr_t 做一些算术运算的主要内容,如果未能解决你的问题,请参考以下文章

Linux-shell-算术运算{exprbcdc(( ))和[ ]}

bash的算术运算与条件测试

汇编,栈上局部变量的算术运算

Shell算术运算

算术和逻辑运算指令

R因子的算术运算