Intelligence without ambition is a bird without wings.

2016-10-27
时间

时区

代码中需要时区相关信息时,通过tzset来初始化相关全局变量,然后读取

tzset原理

  1. 优先读取TZ环境变量值

  2. 若找不到,则使用系统相关的数据文件tzfile(5)

    一般都是通过/etc/localtime符号链接过去的一个文件,如:lrwxrwxrwx. 1 root root 35 Apr 13 2016 /etc/localtime -> ../usr/share/zoneinfo/Asia/Shanghai

参考

  1. man tzset

  2. man tzfile

阅读此文

2016-10-26
编程经验

  1. 采用分治法,将大问题划分为多个小问题解决

  2. 采用辅助信息(字段),来简化逻辑

  3. 多用单元测试(实例),将问题点暴露出来,加深对问题的理解,从而解决

阅读此文

2016-10-24
C++11

核心语言运行期强化

  • 右值引用及MOVE语义,避免临时对象拷贝析构,极大地提升了语言执行效率,支持完美转发,简洁地定义模板

核心语言使用性加强

增加的标准库

  • <memory> 强大的智能指针

  • <regex> 对正则的支持

  • <thread> 多线程支持

  • <unordermap> hashmap支持

参考

  1. https://zh.wikipedia.org/wiki/C%2B%2B11#C.2B.2B.E6.A0.B8.E5.BF.83.E8.AA.9E.E8.A8.80.E7.9A.84.E6.93.B4.E5.85.85
阅读此文

2016-10-17
C++-多重继承

要点

  1. 当一个类有多个父类时,每个父类在内存中依次排列,然后该类自己的成员。
  2. 每一个父类的镜像中,都包含有独立的虚函数表
  3. 当把子类的指针Upcast的时候,两种Upcast的方式得到的结果分别指向各自的父类镜像
  4. 当两个父类重载的虚函数不同时,会使用Thunk机制,也就是说,虚函数表中的函数指针并不指向实际的虚函数,而是指向一小段代码。在这一小段代码中,会修改This指针(ECX寄存器),使之指向合适的父类镜像,然后再跳转到实际的虚函数体。
  5. 当不使用虚继承时,共同基类的成员对象,在子类中会有独立两分(从两个父类各自继承了一份)。
  6. 当使用虚继承时,共同基类的成员对象也会在虚函数表中记录,访问它必须先查找虚函数表。

为什么不建议使用多重继承?

  1. 可能会引入菱形继承,而为了解决这种问题,有需要引入虚拟继承,而虚拟继承实现复杂,占用更多的内存,且效率低
阅读此文

2016-10-17
C++-虚函数

虚函数表

一个指针数组,该指针指向相应的虚函数(non-static member function)

原理

  1. class(满足相应条件)有唯一一个虚函数表(vtbl)

  2. 每个class对象,内部含有一个隐藏数据成员(vptr),指向该class的虚函数表

  3. 当调用虚函数时,根据该虚函数的索引(在class virtual中声明的顺序),通过vptr查vtbl,间接调用

    pC1->f1() => *(pC1->vptr[i])(pC1);
    

什么样的class有虚函数表?

  1. 定义了虚函数

  2. 从有虚函数派生的类

参考

  1. More Effective C++ Item24
阅读此文

2016-10-15
slab

概述

一种内存分配机制,基于对象(特定数据结构)管理内存,主要针对于经常分配并释放的对象,如进程描述符等。

基于同种对象管理,当分配时,直接返回空闲的,释放时,直接收回,不返还给上级内存管理。

优点

  • 分配和释放效率高

  • 基于对象去管理内存,避免了内存碎片

  • 支持通用对象的初始化,客户端使用免初始化,加快了效率

  • 支持cache line,更好地发挥了硬件性能,提高了整体效率

阅读此文

2016-10-15
STL容器比较

vector

采用连续的存储空间实现

优点

  • 占用内存少

  • 支持下标访问,快速的随机访问能力

缺点

  • 插入或删除中间数据效率低,且耗时不固定(对于一些场景来说,影响效率)

  • 只支持尾部push,pop

  • 当可用空间不足时,会重新分配空间(原来的2倍),在C++11之前,会极大地影响效率,因为需要拷贝,再销毁原来元素,还会引起迭代器失效

list

采用链表实现

优点

  • 插入或删除效率高,且耗时固定

  • 可在两端进行push,pop

缺点

  • 占用更多的内存

  • 不支持随机访问

stack

提供栈概念

queue

提供队列(FIFO)概念

dequeue

提供双端队列概念

优点

  • 支持随机访问和at

  • 可在两端进行push、pop

priority_queue

提供优先级队列概念

set

提供集合概念(元素唯一),内部采用平衡二叉树实现,遍历时有序

unordered_set

无序的集合

multiset

可重复的集合

unordered_multiset

无序的,可重复的集合

tuple

提供元组概念(存储一组不同类型的值)

map

提供字典概念,内部采用红黑树实现,遍历时有序

multimap

key可重复的map

unordered_map

无序字典,又叫hashmap,内部采用hash实现,相比map,多占用内存(存放hash桶元素),访问效率高

unordered_multimap

key可重复的hashmap

array

数组,存储固定大小的序列

优点

  • 相比C风格数组,提供了STL式API,越界检查
阅读此文

2016-10-15
markdown-resume

  1. git clone https://github.com/there4/markdown-resume.git

  2. 安装依赖

    sudo yum install php-mbstring wkhtmltopdf -y
    
  3. 测试

    ./bin/md2resume html examples/source/zhsample.md examples/output/
    
阅读此文

2016-10-10
ssh

选项

  • -C

    压缩数据

  • -N

    不执行命令,只在端口转发时特别有用

  • -v

    显示详细信息,便于追踪调试

  • -F /path/to/configfile

    指定配置文件

实例

  • 服务端开启调试

    sudo /usr/sbin/sshd -p 22 -d
    
  • 客户端verbose

    ssh -vT git@112.74.81.30 -p 22
    
  • 生成ssh key

    ssh-keygen -C "wallace@beme 2016-06-30 15:43:00"
    
  • ssh后,执行指定命令

    ssh web -t "cd $web_dir; bash"
    
  • 本地转发

    ssh -4vCNL 6000:rm-wz9cp2458eedl74zs.mysql.rds.aliyuncs.com:3306 of-dev01
    
  • socket代理

    ssh -D 0.0.0.0:1124 -C root@104.238.150.39
    
  • 修改密钥对密码

    ssh-keygen -p
    
阅读此文

2016-09-29
go-flag

要点

  • 最好不要在init中调用flag.Parse(),因为这样会导致其他包定义的flag无效

  • 多个不同的包,可以使用不同的flagset来处理

阅读此文