由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 问一道动态内存分配用linked list的题目【CISCO】
相关主题
150题的2.4,我自己写的是这样的,报NullPointerException分享:non-recursive breadth first search and depth first search algorithm in C
问个C的基本问题请教一下这个alignment怎么理解???
amazon onsite 面经ebay search组面经,估计要挂
这两个edit distance的code求问CC150书上16.9的“multiple of alignment”是什么意思??
paging和 segmentation有什么区别?一个cc150里面的题目,不解
how to implement malloc?请教精通WCF的技术大牛。
报个电面的面经和据信吧, 求安慰问一个google面经题【地里转得】
CISCO 面经,有点坑爹。顺便请教一题。CarerCup 书里面的关于memory的一道题
相关话题的讨论汇总
话题: size话题: chunkhead话题: firstchunk话题: null话题: addr
进入JobHunting版参与讨论
1 (共1页)
g********o
发帖数: 30
1
问大家一道题,CISCO的。说是要实现一个myMalloc(),每次分配固定的size。固定
的size做起来应该简单不少。解法应该是用两个list,一个记录用过的,一个记录free
的,如果free的有,就把free的头结点去掉,加到used list的头部。假设可以用
malloc一次分配一个MAX_SIZE的大block,如何实现myMalloc和myFree?
这方法是我在事后想到的,不过我在如何初始化这个free list的时候卡住了。请问记
录free list如何初始化,是用n个结点的data来记录每一块内存的位置吗?
r*******e
发帖数: 7583
2
固定size的相对容易
都不需要额外的list structure,直接在free memory block里做记录
对于每一个free block
在首地址处记录下一个free block的地址,形成一个embedded link list
初始状态:
全局变量FirstFreeBlock指向大block的首地址
对n = MAX_SIZE/size 个blocks,初始化其首地址使其形成链表
myMalloc操作:
rtn = FirstFreeBlock
FirstFreeBlock = FirstFreeBlock->next
return rtn
myFree:
addr->next = FirstFreeBlock
FirstFreeBlock = addr

free

【在 g********o 的大作中提到】
: 问大家一道题,CISCO的。说是要实现一个myMalloc(),每次分配固定的size。固定
: 的size做起来应该简单不少。解法应该是用两个list,一个记录用过的,一个记录free
: 的,如果free的有,就把free的头结点去掉,加到used list的头部。假设可以用
: malloc一次分配一个MAX_SIZE的大block,如何实现myMalloc和myFree?
: 这方法是我在事后想到的,不过我在如何初始化这个free list的时候卡住了。请问记
: 录free list如何初始化,是用n个结点的data来记录每一块内存的位置吗?

b******7
发帖数: 92
3
#define BLOCK_SIZE 1024
#define ALIGN(size,unit) (((size)+(unit-1))/(unit)*(unit))
struct ChunkHead{
ChunkHead * next;
};
#define CHUNK_SIZE ALIGN(sizeof(ChunkHead) + BLOCK_SIZE, sizeof(int))
ChunkHead * firstChunk;
void initChunk(void * addr, size_t size)
{
firstChunk = NULL;
Chunk * pre = NULL;
for(int i = 0; i < size/CHUNK_SIZE; i++)
{
ChunkHead * cur = (ChunkHead *)(addr + i* CHUNK_SIZE);
if( pre != NULL)
pre->next = cur;
else
firstChunk = cur;
pre = cur;
}
if(pre != NULL) pre->next = NULL;
}
void * myMalloc()
{
if(firstChunk == NULL) return NULL;
void * result = firstChunk + sizeof(ChunkHead);
firstChunk = firstChunk->next;
return result;
}
void myFree(void * addr)
{
if(addr == NULL) return;
ChunkHead * cur = (ChunkHead *)(addr - sizeof(ChunkHead));
cur->next = firstChunk;
firstChunk = cur;
}
g********o
发帖数: 30
4

谢谢!

【在 b******7 的大作中提到】
: #define BLOCK_SIZE 1024
: #define ALIGN(size,unit) (((size)+(unit-1))/(unit)*(unit))
: struct ChunkHead{
: ChunkHead * next;
: };
: #define CHUNK_SIZE ALIGN(sizeof(ChunkHead) + BLOCK_SIZE, sizeof(int))
: ChunkHead * firstChunk;
: void initChunk(void * addr, size_t size)
: {
: firstChunk = NULL;

g********o
发帖数: 30
5

谢谢!!!3楼的代码好像正确!

【在 r*******e 的大作中提到】
: 固定size的相对容易
: 都不需要额外的list structure,直接在free memory block里做记录
: 对于每一个free block
: 在首地址处记录下一个free block的地址,形成一个embedded link list
: 初始状态:
: 全局变量FirstFreeBlock指向大block的首地址
: 对n = MAX_SIZE/size 个blocks,初始化其首地址使其形成链表
: myMalloc操作:
: rtn = FirstFreeBlock
: FirstFreeBlock = FirstFreeBlock->next

g********o
发帖数: 30
6

能不能解释一下没有这句话会怎么样?:
#define ALIGN(size,unit) (((size)+(unit-1))/(unit)*(unit))

【在 b******7 的大作中提到】
: #define BLOCK_SIZE 1024
: #define ALIGN(size,unit) (((size)+(unit-1))/(unit)*(unit))
: struct ChunkHead{
: ChunkHead * next;
: };
: #define CHUNK_SIZE ALIGN(sizeof(ChunkHead) + BLOCK_SIZE, sizeof(int))
: ChunkHead * firstChunk;
: void initChunk(void * addr, size_t size)
: {
: firstChunk = NULL;

b******7
发帖数: 92
7
内存对其用的,最常见的按4字节对齐,若不对齐,会导致cpu取数据时多次寻址,效率
有影响。

【在 g********o 的大作中提到】
:
: 能不能解释一下没有这句话会怎么样?:
: #define ALIGN(size,unit) (((size)+(unit-1))/(unit)*(unit))

y****1
发帖数: 58
8
有个疑惑。 谁能解释一下啊? 谢谢
void initChunk(void * addr, size_t size)
中的 addr 有什么用啊? 是通过malloc返回的地址吗?
谢谢

【在 b******7 的大作中提到】
: #define BLOCK_SIZE 1024
: #define ALIGN(size,unit) (((size)+(unit-1))/(unit)*(unit))
: struct ChunkHead{
: ChunkHead * next;
: };
: #define CHUNK_SIZE ALIGN(sizeof(ChunkHead) + BLOCK_SIZE, sizeof(int))
: ChunkHead * firstChunk;
: void initChunk(void * addr, size_t size)
: {
: firstChunk = NULL;

1 (共1页)
进入JobHunting版参与讨论
相关主题
CarerCup 书里面的关于memory的一道题paging和 segmentation有什么区别?
一个小问题,请高人指点!how to implement malloc?
Amazon.com电面报个电面的面经和据信吧, 求安慰
问几个unix/c++工作面试题CISCO 面经,有点坑爹。顺便请教一题。
150题的2.4,我自己写的是这样的,报NullPointerException分享:non-recursive breadth first search and depth first search algorithm in C
问个C的基本问题请教一下这个alignment怎么理解???
amazon onsite 面经ebay search组面经,估计要挂
这两个edit distance的code求问CC150书上16.9的“multiple of alignment”是什么意思??
相关话题的讨论汇总
话题: size话题: chunkhead话题: firstchunk话题: null话题: addr