日本程序开发式自定义的malloc/free函数(一)-外部式样书(外部仕様書)
本文章绝大部分通过日文编写,适当的地方会以中文标注。
本人还是在校学生,有不好的地方请见谅。
请需要参考本文的小伙伴不要无脑得直接复制了得,我希望你们能理解malloc的原理以后再来看本文。(如果你真的复制了,要是是我的师弟师妹,老师可能会发现的哦)
malloc的实现方法网上有一大堆,本文主要参考http://blog.codinglabs.org/articles/a-malloc-tutorial.html
感谢大神。
本系列文章分三部分,第一部分外部式样书,第二部分内部式样书,第三部分源代码
所以具体的代码实现在第三次,前面的步骤只是对程序进行设计。
外部式样书(外部仕様書)是日本程序开发的第一个规划设计书,我自己的理解只是对自己想写的程序有个大致的规划,类似于黑盒测试,只是简单描述函数的返回值,参数类型,还有这个函数的功能,还要想好参数,返回值的范围,方便之后写内部式样书。
关于日本式样书的详细写法可以在雅虎上找到答案,本文不是绝对的,仅供参考。
本文同时包括测试用例(テストケース),测试用例目前阶段就是对自己假想的函数的输入以后有什么样的输出做一下描述就行。
外部仕様書
関数,あるいはモジュールの説明-模块说明
void*myAlloc(unsigned elementSize){
/*
使われ方 例えば、unsigned *p = (unsigned*) myAlloc(sizeof(unsigned));で使います;
戻り値の型ポインタ;-指针类型
戻り値の範囲成功したら、このメモリ指すポインタを戻ります;
もし失敗したら、NULLポインタを戻ります;-失败返回NULL
正常値の範囲 elementSize>0でも大き過ぎはダメです;
モジュールや関数の機能の説明 2*elementSize byteのメモリを分配することができます。
}
void myFree(void* block){
/*
使われ方例えば、unsigned *p = (unsigned*) myAlloc(sizeof(unsigned));…………..myFree(p); で使います;
戻り値の型なし;
戻り値の範囲 なし;
正常値の範囲 NULLではない、解放したいメモリを指すポインタ;
モジュールや関数の機能の説明 ポインタを指すメモリブロックが再利用のために解放されることができます;-为了指针指向的区块再利用也就是可以释放的他的空间,为了新的区块
*/
}
大域(global)変数
static HDR *temp = NULL;//空きポインタをNULLに初期化します。-temp初始化成NULL
#define sizeOfBlock 24;//Headerのサイズを決めます。
新しく宣言されたレコード型(record type)の説明
typedef struct Header{
unsigned elementSize //実際のブロックのサイズ-实际的区块的大小
struct Header *pre,*next;// 前駆と後継ポインタ
int free;//空いているかを示し-表示是否是空的,空的1,不是0
int filling;// アドレスをアライメントしやすいため、フィラーします。-用于填充空间变成24字节
int *pmc//dat;を指しポインタ、アドレスの正しさを確認するように使います。-为了确认地址是否正确
char data[1];//データブラックの最初なバイト。-为了能用pmc指向尾端的地址
}*t_header;//別名を与える-t_header 就相当于Header*
テストケース
l 呼び出し方 myAlloc(sizeof(VARIABLETYPE));
結果 有効なポインタを戻ります、2* sizeof(VARIABLETYPE)バイトのメモリが割付けされることができます。
l 呼び出し方 myAlloc(X);
結果2 もしXは大き過ぎると、エラーします。-太大了出错
l 呼び出し方 myAlloc(-1);
結果 NULLポインタを戻ります,メモリは割付けされません、エラーします。
呼び出し方 myFree(p1);//p1はNULLポインタでわないです。
結果 p1を指すメモリブロックを解放できます。
l 呼び出し方 myFree(p2);//p2はNULLポインタです。
結果 エラーします。
2017-04-28
ps:第一次写了内部式样书,可能你写内部式样书的时候就会就得有不足的地方,最好写之前多想想。