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

发布于 2022-09-06 03:01:59 字数 42 浏览 36 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

妖妓 2022-09-13 03:01:59

pragma pack(16)

守望孤独 2022-09-13 03:01:59

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

困倦 2022-09-13 03:01:59

应该是地址操作的问题

忆离笙 2022-09-13 03:01:59

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

但是我感觉不会这么简单吧?
蹲墙角沉默 2022-09-13 03:01:59

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

亣腦蒛氧 2022-09-13 03:01:59

我能想到的思路是这样的
::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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文