【问题标题】:Use intptr_t to do some arithmetic computing使用 intptr_t 做一些算术运算
【发布时间】: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

标签: c++


【解决方案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;
    

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

    【讨论】:

      猜你喜欢
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 2012-12-16
      相关资源
      最近更新 更多