c++培训周总结5

培训部分

静态库.

以lib开头,a为文件后缀

先用gcc生成.o文件

ar -r libxxx.a xxx.o xxx1.o ...

gcc main.c xxx.a


动态库

gcc -shared xxx.c -olibmuku.so

gcc main.c -lmuku -L.

如果动态库和静态库名字一样放一起,会优先调用动态


c语言错误处理

全局变量error

perror();

printf("%m");


全局变量extern char ** environ;

相关函数

getenv(),putenv().....


unix内存管理

c语言部分  malloc(),free();

系统调用 sbrk(),brk();

系统调用 mmap(),munmap()

底层  kmalloc();


unic采用虚拟内存管理,每个进程分配4g .0-3g用户空间,3-4g系统空间

代码区,只读常量区,全局区,bbs段(未初始化数据段),堆,栈依次排列

全局变量如果没有赋值就会在bbs段

栈从3g向0开辟,堆从bbs段之后向3g开辟


内存映射以页为最小单位,4K

malloc一次至少会分配一页,有些系统会多分配33页.33这个数字..天知道怎么来的.

malloc负责开辟虚拟地址,不一定会映射

free负责回收,不一定立刻回收.free不回收最后33页


void *sbrk()一般用来分配内存,sbrk(x)指针移动x,可正可负

int brk()一般用来释放内存,brk(void* x)指针移动到x位置

都是维持着一个文件指针,sbrk(0)返回当前位置


mmap(),munmap()做内存映射,以一页为单位

貌似没什么用,又麻烦,忽略


内存对应的目录/proc/PID/

/dev/tty 键盘,显示器

/dev/null 空设备,清空


文件操作的系统调用

open(0,read(),write().close()

c语言有时比系统调用快主要是用了一个全局变量作为缓存


每个进程打开一个文件就会生成一个文件表,内容是文件描述符,文件偏移量,v节点位置

lseek(int fd,off_t offset,int whence)

文件描述符,偏移量,起点

起点:

SEEK_SET 0 从头

SEEK_CUR 1从当前位置

SEEK_END 2从文件尾开始,文件尾是指文件EOF之后一个位置


dup(int fd),dup2(int newfd,int oldfd)复制文件描述符,一个整数


文件操作函数fcntl()  <fcntl.h>

用法略


文件锁结构

   struct flock{
     short l_type;//锁的类型
     short l_whence;//锁定的起点参照
     off_t l_start;//锁定的起点偏移量
     off_t l_len;//锁定区域的长度
     pid_t l_pid;//锁定进程的ID,只有F_GETLK使用,F_SETLK给 -1就可以

   };

文件锁的作用只是给文件一个无关紧要状态,没有强制力


自学部分

迭代器

iter_swap()交换两个迭代器的内容

rbegin()指向end()-1;

rend()指向begin()-1;

操作按照逆向操作


流迭代器

ostream_iterator<T>(ostream)

ostream_iterator<T>(ostream,delim) delim是分隔符,const char*类型


struct random_access_iterator_tag

继承

struct bidirectional_iterator_tag

继承

struct forward_iterator_tag

继承

struct input_iterator_tag

继承

struct output_iterator_tag


仿函数

执行速度上,仿函数通常比函数指针更快


仿函数拥有内部状态

generate(coll.begin(),coll.end(),IntSequence(42));

仿函数是传值,不是传引用

除非显式用引用传参

IntSequence seq(1)

generate_n<back_insert_iterator<list<int> > ,int, IntSequence& >( back_inserter(coll),4,seq);


自修p300

MeanValue mv=for_each(coll.begin(),coll.end().MeanValue());

cout<<mv.value<<endl;


p305

预定义仿函数

头文件 functional

算数计算,比较,逻辑3运算


配接器

find_if(coll.begin(),coll.end(),bind2nd(greater<int>(),42));

p306印错了!

表达式                              效果

bind1st(op,value) op(value,param)

bind2nd(op,value) op(param,value)

not1(op) !op(param)

not2(op) !op(param1,param2);

bind1st(f,x)=>F(param)=f(x,param);

bind2nd(f,x)=>F(param)=f(param,x);

针对成员函数的配接器

mem_fun_ref(op)  调用op,那是某对象的一个const成员函数

mem_fun(op)   调用op,那是某对象指针的一个const成员函数

for_each(coll.begin(),coll.end(),&Person::print);


针对一般函数的配接器

prt_fun(op)  

find_if(coll.begin(),coll.end(),bind2nd(ptr_fun(strcmp),""));


自定义配接器

p310

template<class T1,class T2>

struct xxx:pjublic std::binary_function<T1,T2,T1>

{

T1 operator() (T1 base,T2 exp) const{....}

};


组合型仿函数

transform(coll.begin(),coll.end(),

ostream_iterator<int>(cout," "),

compose_f_gx(bind2nd(multiplies<int>(),5),

bind2nd(plus<int>(),10))

);

param =>  x= plus<int>(param,10)

=>multiplies<int>(x,5)=>cout;








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值