最近比较迷茫 不知道喜欢什么 以后又做什么方向比较好
于是强迫自己静下心来读读侯捷老师翻译的STL源码剖析
说实话刚开始看的时候感觉好难(可能也有c++许久不看了的缘故
翻出来c++的教材 又拿出来c++primer 总算看下去啦
其实觉得还是特别有意思的 比学框架调调包啥很是更能找到最初喜欢计算机的从头开始的快感的
********************************************************************************
我是从第二单元开始的 第一单元只搞得翻了翻 呃 确实不咋看的下去 不过没关系 我们要学会变通 兴趣才是学习的最好导师嘛 不感兴趣的东西很难看下去 效率比较低 后面有问题回头再看就好啦
第二单元一开始就先根据前述的接口标准撸了一个很简单的空间配置器,不过自己写了一遍后发现了很多问题(之前学c++就学的不是很精 又好久没用过了 我发现的问题也都是自己没解决的 很有可能是我学艺不精 如果可以 还请各位大佬不吝赐教)...
#ifndef __myjjalloc__
#define __myjjalloc__
//简化版简单的空间配置器
#include <new>
#include <cstddef>
#include <cstdlib>
#include <climits>
#include <iostream>
namespace JJ{
//分配空间
template <class T>
inline T* _allocate (ptrdiff_t size , T* )
{
//防溢出又报错了 表示没有这个函数
//set_new_handler(0);
T* tmp = new T (size*sizeof(T));
/*if (tmp = 0){
cern <<"out of memory"<<endl;
exit(1);
}*/
return tmp;
}
//删除空间
template <class T>
inline void _deallocate(T* buffer){
delete(buffer);
}
//分配值
template <class T1,class T2>
inline void _construct(T1 *p , const T2& value){
new (p) T1(value);
}
template <class T>
inline void _destroy(T* ptr){
ptr->~T();
}
template <class T>
class allocator {
public :
typedef T value_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
//rebind : 重新绑定,重新编译
template <class U>
struct rebind{
typedef allocator<U> other;
};
/
//为什么没用hint?
pointer allocate(size_type n,const void* hint = 0){
return _allocate((difference_type)n,(pointer)0);
}
//传了为什么不用?
void deallocate(pointer p , size_type n){
_deallocate(p);
}
void construct(pointer p,const T& value){
_construct(p,value);
}
void destroy(pointer p ){
_destroy(p);
}
//返回地址
pointer address (reference x){
return (pointer)&x;
}
const_pointer const_address(const_reference x){
return (const_pointer)&x;
}
//获得最大T的空间 先注释 最大空间unix_max在哪儿定义的呀 没找到
/*size_type max_size()const {
return size_type(UNIT_MAX/sizeof(T));
}*/
};
}
#endif
1.首先侯老师说 set_new_handler()这个函数可以处理内存不够的时候的情况 不过我编译的时候报错没有这个函数 查了半天好像也没有解决 没办法 解决不了先注释了哈哈哈
2.::operator new这个写法也没通过 报错了 我刚开始还以为::前面应该有东西才对 不过百度了一下好像这样写是直接调用最外层的命名空间?不知道欸 而且operate new和new有啥区别...每太搞懂
3.void原来可以用作任意类型声明啊?!记下来了!
4.delete和new一样..就把::operate 删了..
5.其实看后面一课的时候发现 好多函数比方穿了两个参数 但只用一个?后面还会有fun(int )这种写法 以前学c++的时候真的都没见过这么写的 不是很明白传递了不用或者传递了连个参数名都不舍得给?!(真吝啬哈哈哈哈哈) 不过细细想想可能是因为标准化接口吧 这样对于这样的接口传递什么样的参数就比较清晰 不然还得分情况哈 像这种传来不用就好了 (不知道这算不算另一种形式主义哈哈哈哈)
6.最后一个函数能看懂是获得这个分配器的空间大小吧大概hh 不过侯老师呀这个UINT_MAX在哪里定义了?难道是其他头文件声明说着分配器生成的时候规定的?没办法 运行不了 先注释了哈哈哈不过大概懂什么意思就好啦
这个简单的分配器就写完啦 说实话我写完后觉得和书上比少了挺多哈哈哈哈 不过还好啦 这课结束的地方给了段代码可以跑一下这个分配器 虽然阉割了挺多代码 但看着结果被跑出来别提多高兴啦
下次总结了些东西会继续发的!如果想看的话敬请期待哦
最后想说一下 学计算机还是要多敲代码 才能更好的理解 而且有了问题还是要多动手去解决 书上的东西也是 主要讲的是一个方向 未必要万完全死学书 可以自己发挥理解嘛 尽信书不如无数 大家一起加油啊!
最后的最后 能不能求个关注呢 ?(>﹏<)第一次发博客记录学习 如果写的不好 请指点!