现有一个程序需要申请的地址是要求起始地址必须是16的倍数,如何设计(C++面试题)?

这是我看到的一道面试题,不知道怎么下手?希望前辈可以指导一下,蟹蟹!!

阅读 5.3k
6 个回答

pragma pack(16)

不行,这个pragma pack编译时的指令,影响的是编译器如何安排全局变量、局部变量,不会影响C库函数malloc的行为的。既然是申请内存,肯定是malloc之类的堆内存。
可以malloc一大块内存,自己维护一个内存池。

应该是地址操作的问题

我不太明白你的题目的意思?你要申请的空间是变量空间吧?如果是这样,我觉得是这样:
用new申请空间?我感觉是new一个变量空间并用指针接受该地址,然后取指针所存的地址,判断地址是否为16的倍数,若不是就delete它,若是就保留。

但是我感觉不会这么简单吧?
新手上路,请多包涵

自己封装malloc、free,分配时,多分配align个空间,然后取对其后的地址返回,返回地址前一个字节保存offset,free时根据offset,做真实的free。

我能想到的思路是这样的
::operator new::operator delete的重载

map<void*, void*> g_mapPtr16ToPtr;
void* ::operator new(size_t size)
{
  void* ptr = malloc(size);
  void* ptr_16 = ((unsigned int)ptr)%16
  g_mapPtr16ToPtr[ptr_16] = ptr;
  return ptr_16;
}
void operator delete(void* ptr_16)
{
  free(g_mapPtr16ToPtr[ptr_16]);
  g_mapPtr16ToPtr.erase(ptr_16);
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题