使用 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 做一些算术运算的主要内容,如果未能解决你的问题,请参考以下文章