这是我看到的一道面试题,不知道怎么下手?希望前辈可以指导一下,蟹蟹!!
不行,这个pragma pack编译时的指令,影响的是编译器如何安排全局变量、局部变量,不会影响C库函数malloc的行为的。既然是申请内存,肯定是malloc之类的堆内存。
可以malloc一大块内存,自己维护一个内存池。
我不太明白你的题目的意思?你要申请的空间是变量空间吧?如果是这样,我觉得是这样:
用new申请空间?我感觉是new一个变量空间并用指针接受该地址,然后取指针所存的地址,判断地址是否为16的倍数,若不是就delete它,若是就保留。
但是我感觉不会这么简单吧?
我能想到的思路是这样的::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);
}
3 回答1.3k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
4 回答846 阅读
1 回答922 阅读
1 回答957 阅读
1 回答723 阅读
1 回答823 阅读
pragma pack(16)