关于虚函数,需要知道:

  • 多态在C++中借助虚函数实现
  • 多态只在指针或者引用上发生
  • 虚函数机制(通常)借助虚指针vptr支持
  • 虚函数地址保存在虚函数表中
  • 一个类的所有对象共有一张vtbl
  • vtbl由vptr指向,vptr保存在每一个对象中,多继承时可能有多个vptr
  • vptr由构造函数(普通构造/copy构造)在对象初始化时隐式设定
Tags: ,.

  相信很多人经常遇到文件乱码,尤其是文本文件。如果你不是用编辑器打开一个二进制文件的话,这应该是一个编码问题,即文件的实际编码和编辑器查看该文件时所使用的编码不一致。这时候,咱们需要把文件的编码进行转化,或者修改使用该文件的程序采用的编码。后一种方法取决于咱们使用的具体的程序,无法一概而论。
  这里介绍一个工具,iconv,使用它可以将一个输入文件从一种编码转换到另一种编码,同时将转化结果输出。iconv的-f选项指定源编码,-t选项指定目标编码,-o指定输出文件:

$ iconv -f coding1 -t coding2 file1 -o file2

  若file1省略,则使用标准输入;若-o选项省略,则使用标准输出。
  例如,我想把所有GBK编码的.cue文件转化为utf8编码:

$ find . -name "*.cue" -exec iconv -f gbk -t utf8 {} -o {} \;
Tags: ,,.

  递归是一种使用相同的方法,通过解决问题的子集以达到解决整个问题的方法,是一种使用有限代码解决“无限”计算的方法。在C/C++语言中递归表现在函数对自身的直接/间接的调用上,在实现上,递归依赖于语言的运行时调用堆栈,使用堆栈来保存每一次递归调用返回时所需要的条件。递归通常具有简洁的编码和清晰的思路,但这种简洁是有代价的。一方面,是函数调用的负担;另一方面,是堆栈占用的负担(堆栈的大小是有限的)。
  避免这种负担的方法就是将递归转化为迭代。迭代的思想主要在于,在同一栈帧中不断使用现有数据计算出新的数据,然后使用新的数据来替换原有数据。递归于迭代可以相互转化。将递归转化为迭代需要做两方面的工作:显式地维护一个堆栈,在递归算法中堆栈的维护由编译器隐式地完成;使用迭代控制结构,完成出栈、入栈和相关的计算。

Tags: ,,.

  reserve内部是怎么实现的呢?当然是new了。那么在reserve操作,也就是new之后,我们程序是否立即就占用了这些内存呢?这就要看我们这里说的“内存”是什么样的内存了。什么意思呢?我们知道,现代操作系统都采用了虚拟内存的机制,内存占用也就有了虚拟内存(virtual memory)和物理内存(physical memory)之分了。
  我们又知道,Unix/Linux进程的虚拟地址空间被按用途被划分成了内核空间和用户空间。内核空间供操作系统的内核使用,用户空间供用户程序支配。其中用户空间又被划分为若干段,主要包括:代码段(.text),用来存放/映射用户程序的代码;数据段(.data),存放初始化的全局数据或静态数据,这部分在文件系统中也占据磁盘空间;.bss段(一直没找到一个亲切的翻译),存放为初始化的全局或静态数据,在程序加载时分配空间和初始化,这部分空间不占用磁盘空间(当然在可执行文件中要保留其大小);堆栈段,用来保存程序执行时的上下文(局部变量、函数参数和返回地址等),在进程建立时由操作系统分配,空间较小且在运行时不可动态调整,增长方向因机器架构而异,IA上自高地址向下增长,堆栈不占用磁盘空间;堆,供用户在运行时动态地申请和使用,空间较大,未被申请的堆空间不可使用,也不会被映射到物理空间,堆随着用户程序申请向上增长,堆不占用磁盘空间。

Tags: ,,.

基本使用:

  • \di 进入画图模式;
  • \ds 离开画图模式;
  • 上下左右方向键,移动并画图;
  • Shift+上下左右方向键,只移动光标;
  • 空格键,打开/关闭擦除模式,擦除模式下,移动光标时光标处字符被空格取代;
  • >, <, ^, v,画箭头;
  • \>, \<, \^, \v,画粗箭头;
  • 可视化模式,即Ctrl + v后加motion后选中的文本块,可以使用下面快捷键:
    • \a 画箭头,区块开始处,指向区块结束处;
    • \b 画矩形框;
    • \c 画幕布,会提示行数,列数使用&textwidth选项,默认78列;
    • \e 画椭圆;
    • \l 划线。
  • 其他参考:h DrawIt。

  建议:类似上面框图,先画好框架,然后利用Vim的替换模式(普通模式下按R)进行标识。

Tags: ,.

  conky是Linux/Unix环境下面的一个用于可视化地显示系统信息的小程序,它可以嵌入到桌面,实时地显示CPU、内存、磁盘、文件系统、网络、电源等的状况,还可以显示一些特定程序的状态,比如moc, audacious, mpd&mpc等音乐播放器,甚至可以调用外部命令并将命令的输出显示出来。下面是我的conky截图,
conky

Tags: .

  关于C++ STL容器的默认内存管理,需参考allocator。
  关于deque的内存模型及其clear操作,我不甚了了,请参考您使用的标准库的代码。
  若想深入了解STL的实现,侯捷大叔的《STL源码剖析》是不错的入门资料,希望能够拜读。
  C++标准中并未对STL的实现细节做过多规定,因此不同实现的细节和表现可能不同。

  C++很复杂,但也并非无底黑洞。学好C++很难,但这种学习过程也会使你收获颇丰。
  学习任何一种技术,都需要热情、激情和足够的耐心。
  做好一件事,需要激情,同时激情常常来源于做好一件事情的满足感。
  满足感会增强人分享的欲望,分享的欲望也常常会使人具有亲和力和感染力,使人觉得你有激情,反过来更有利于人做好一件事。
  blabla, over~

Tags: ,.

  头文件中通常包含有:函数原型(声明)、宏定义、内联函数定义。
  头文件使用#include宏命令引入。有两种形式:#inlcude <header.h>和#include “header.h”. 两种形式的区别在于预处理器(preprocessor)查找头文件的方式的不同:对于前者,预处理器仅在系统预定义的标准路径中查找(标准查找路径由环境变量指明),比如/usr/include, /usr/local/include;对于后者,预处理器首先查找(源文件所在的)当前目录,若未找到,则到标准路径查找。另外,查找路径还可以通过编译器选项(-I for gcc)指定。通常,对于C/C++标准库和其他系统范围的程序库,使用<>形式,对于程序本身定义的头文件,采用”"形式。

Tags: ,.

  看书时使用思维导图做笔记真是很方便。

Tags: ,.

  alias, 假名,别名,bash的一个内建命令,用来给常用的较长的命令定义个简短的名称。
  alias命令的基本格式为alias [word[='command']], []内为可选项。定义word为command的别名。若=’command’部分省略,则输出word之前的定义,未定义则报错。单独的alias列出当前环境中所有可用的别名。通常来讲,关于alias,知道这么多就行了。但在使用alias的过程中还有一些问题需要注意。
  如果bash的expand_aliases选项没有被设置,那么在非交互式shell中alias不会被执行展开。也就是说,在shell脚本中,使用alias会导致”command not found”的错误。使用shopt命令来设置expand_aliases选项:

1
shopt -s expand_aliases

设置这个选项,可以在bashrc中,也可以在需要使用alias的脚本中。

Tags: .
Page 3 of 3112345678910...2030...Last »