- 博客(36)
- 收藏
- 关注
原创 static 全局变量的使用
当我们要使用一个全局变量时,往往会在头文件中进行定义,然后使用该变量的地方包含该头文件比如://comm.hint g_val;然后在使用该变量的地方,include该头文件即可。如果这样使用你就错了。 int g_val; 该语句实际上不止是声明,也是定义,会导致程序中有多个这个变量的定义。c++编译器会给出muti-define的错误。此时即使加上stati
2013-01-08 16:56:44
412
转载 gcc 编译优化选项
-O0:这个等级(字母“O”后面跟个零)关闭所有优化选项,也是CFLAGS或CXXFLAGS中没有设置-O等级时的默认等级。这样就不会优化代码,这通常不是我们想要的。 -O1:这是最基本的优化等级。编译器会在不花费太多编译时间的同时试图生成更快更小的代码。这些优化是非常基础的,但一般这些任务肯定能顺利完成。 -O2:-O1的进阶。这是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用
2012-06-04 16:35:38
452
转载 gdb调试C++ STL
原文链接:http://blog.youkuaiyun.com/luoleicn/article/details/5968038GDB中print方法并不能直接打印STL容器中保存的变量,其实只要http://www.yolinux.com/TUTORIALS/src/dbinit_stl_views-1.03.txt这个文件保存为~/.gdbinit 就可以使用它提供的方法方便调试容器
2012-05-18 16:44:31
820
原创 c++中利用宏来声明和定义变量
假设我们要定义一个配置类,类中包含了很多的配置成员,有一种通过宏的方法可以让我们方便的维护繁多的成员在一个类中,定义一个变量需要类型,构造函数中给出的初始值。我们需要能够像脚本语言一样进行配置变量:tconfig.hOPTION(m_data,OPT_INT,-1)OPTION(m_value,OPT_DOUBLE,1)OPTION(m_change,OPT_FLOAT
2012-05-08 19:09:51
5904
转载 Linux系统的常用操作命令大全
转载自:http://hi.baidu.com/jackywdx/blog/item/393ccf4b64268bf482025cde.html系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostna
2011-12-14 20:29:16
486
转载 vim 搜索命令
VIM查找命令VIM命令功能f向前搜索并将光标停留在目标字符上F向后搜索并将光标停留在目标字符上;重复刚才的查找,反向重复刚才的查找t向前搜索并将光标停留在目标字符的前一个字符上T向后搜索并将光标停留在目标字符的后一个字
2011-11-11 10:04:35
798
转载 c++中虚继承机制 内存布局
http://www.cnblogs.com/itech/archive/2009/03/01/1399996.html[C++对象模型][9]虚继承与虚函数表一 虚继承1) 代码:Code#include iost
2011-10-17 22:14:23
421
原创 linux文件的权限
每个文件都有9个权限位:用户的读取执行权限,组的读写执行权限,其他的读写执行权限,分别对应9位。三位一组,8进制数。目录: 当要访问一个目录下的文件时,需要有该目录的可执行权限。目录的可执行权限位也成为搜索位。对目录的读权限意味着在读取该目录下所有文件的列表。对目录的
2011-10-07 19:19:08
302
原创 基础网络知识
OSI模型: 应用层、表示层、会话层,传输层,网络层,数据链路层,物理层。TCP/IP协议模型: 应用层(SMTP、FTP、DNS)、传输层(TCP/UDP)、网络层(IP、ICMP)、网络接口层ping是应用层直接使用网络层ICMP报文。这种询问报文用来测试目的站是否可
2011-10-07 12:05:43
328
转载 c++ 函数名字 重载
作者:吴秦出处:http://www.cnblogs.com/skynet/写在前面:函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题1
2011-09-28 23:21:45
879
原创 c程序内存布局
当一个程序被编译连接为可执行程序时,对于c/c++语言的程序,其内存布局主要是代码段和数据段。代码段text 存放可以执行的代码,拥有可执行权限,一般是只读的。代码段在执行时一般都需要访问内存数据,即数据段的内容。数据段包括以下部分:1 初始化数据区data:存放已经初始
2011-09-28 22:42:38
349
转载 C/C++程序编译的过程
gcc编译c/c++程序为可执行文件的过程实际包括以下几步,假人我们要编译的文件为t.c:1 预编译:由预处理器cpp执行, 可以通过命令cpp -o t.i t.c 进行。 gcc -E t.c -o t.i这一步预处理器把所有include的文件包括递归包含的文件
2011-09-27 21:48:18
452
原创 C++虚函数表
考虑最简单的有虚函数的继承关系:class F{public:virtual void func() {printf("F func\n");}};class S : public F{public:virtual void func(
2011-09-27 18:08:32
357
原创 inline 与 virtual
函数前面加了inline是向编译器进行建议,将该函数定义为内联函数,编译的时候,在调用该函数的位置进行展开。但只是一种建议,不能强制编译器执行。我们知道虚函数是c++多态的一种方式。在继承层次的虚函数关系下,具体调用哪一个虚函数是运行时决定的。在这种情况下的虚函数加了inli
2011-09-27 11:35:38
596
原创 sizeof
sizeof 返回一个对象或者类型名的长度,返回值的类型为size_t,其结果是编译时常量。1 所有的指针大小同等于机器字长2 int 在32位和64位上一般是4字节。long 同等于机器字长。3 sizeof不对表达式进行运算,只取表达式结果
2011-09-27 10:47:09
308
原创 B树 B+树 B*树
1 B 树:一棵m阶的B树,约束条件如下:a 树中一个节点最多有m棵子树,这也是m阶的含义。b 若根节点有孩子,至少有两棵子树。c 除根节点之外的所有非叶子节点至少有[m/2](上界) 棵子树。d 所有的非终端节点包括的信息有:n(该节点含有的关键字数目)
2011-09-26 11:27:18
1742
原创 linux sys_call
每个系统调用都会有一个编号与之相对应。用户态调用一个系统调用,实际上调用运行时库(glibc)中的函数,runtime library会通过80号中断,陷入内核态,通过eax寄存器传递要调用系统调用编号,参数的传递通过寄存器或者copy_to_user等函数,实际通过页面缓存进行
2011-09-26 10:00:33
728
原创 select与epoll,多路IO复用
当一个节点建立了与多个节点之间的连接时,如何去高效的处理多个连接的数据呢?可能有的连接有数据,有的连接没有数据,这中情况下,我们总不能一个个的去recv尝试吧? linux下面给我们提供了select和epoll两组接口以处理这种情况。1 select:
2011-09-24 22:04:15
1030
原创 最长递增子序列问题
设有n个数,求这个数组中最长的递增子序列。 子序列不必在原数组中是连续的。即有:A0,A1,A2 ... An-1,求出序列: Aj1,Aj2,...Aik 该序列递增,并且其中: j1 例如对于数组: 2,3,11,6,8,4,7,12,1,9最长递增子序
2011-09-18 21:26:03
279
原创 linux下的线程
1 什么是线程: 线程包含了进程内执行环境的必需信息:进程中标识线程的线程ID、一组寄存器、栈、调度优先级和策略、信号屏蔽字、errno遍历以及线程私有数据。进程中的所有信息对线程都是共享的,包括可执行程序的文本,程序的全局变量和堆内存、栈以及文件描述符。linux线
2011-09-08 20:06:30
402
原创 container_of
在linux内核中经常遇到container_of宏,定义如下:#define container_of(ptr, type, member) ({ / const typeof( ((type *)0)->member ) *__
2011-09-05 18:03:46
289
原创 tcp keep_alive
我们知道TCP连接关闭时,需要连接的两端中的某一方发起关闭动作,如果某一方突然断电,另外一端是无法知道的。tcp的keep_alive就是用以检测异常的一种机制。有三个参数:1 发送心跳消息的间隔2 未收到回复时,重试的时间间隔3 重试的次数 如果是Linu
2011-08-31 13:05:25
3838
原创 大端小端网络字节顺序
源自格列佛游记,小人国因为从鸡蛋的大端(Big-endian)还是鸡蛋的小端(Little-endian)敲开而发生战争。大端是 最高有效位(MSB) 位于地址的低位,小端则是MSB位于地址的高位。假如16进制的数0x12345678(我们在写一个数的时候,高位总是在最左边)===内存从低到高===>大端:12345678小端:78563412IP协议中规定网络协议以大端为准。x86系列CPU都是
2011-07-02 17:06:56
447
转载 (转)一些鲜为人知的编程真相
1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20%,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码 — —不管他的技术水平有多高。 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价
2011-06-19 12:56:00
371
原创 vim 自动补全类的成员
<br />vim 自动集成了一些补全。最常用的是^+N,局部变量的补全。<br /> <br />要补全类的成员,需要额外的插件,方法如下:<br /> <br />1 首先安装ctags。<br /> 并且创建tags的时候,需要参数:<br /> <br /> --c++-kinds=+p : Adds prototypes in the database for C/C++ files.<br /> --fields=+iaS : Adds inheritance (i), a
2011-05-14 14:44:00
2619
转载 vim 配置文件
" 不要使用vi的键盘模式,而是vim自己的set nocompatible" 显示行号set nu " 为C程序提供自动缩进set smartindent" 语法高亮set syntax=on" 去掉输入错误的提示声音set noeb" 在处理未保存或只读文件的时候,弹出确认"set confirm" 自动缩进set autoindentset cindent" Tab键的宽度set tabstop=4" 统一缩进为4set softtabstop=4set shiftwidth=4" 不要用空格代替制表
2011-03-10 09:46:00
378
原创 c++类型重载 : 避免对指针和数字重载
<br />effctive c++ 条款25:避免对指针和数字重载<br /> <br />因为重载后,指针会被解析为整型,与数字的重载混淆。<br />比如以自定义类型的指针为key建立map,即使你定义了该类的对<的重载,但c++会把对指针的比较以为是对整型的比较,不会调用自定的类型比较。只能传递自定义的比较函数。
2011-03-03 11:32:00
533
原创 c++ map
<br />map set中使用自定义的类型时,需要实现比较操作。注意不能定义为类内部的比较符,因为stl中定义的是要传递两个对象。<br />比如我们有如下定义:<br />#include <map><br />using namespace std;<br /><br /><br />struct T{<br /> T(){}<br /> int a;<br /> int b;<br /> inline bool operator < (const T
2011-03-02 13:13:00
422
原创 c++对象模型 内存布局
<br />比如一个类:<br />class T<br />{<br />public:<br /> void Func();<br /> virtual void Func2();<br />private:<br /> int a;<br /> int b;<br />};<br /> <br />sizeof(T)的大小,如果没有虚函数,那么只有数据成员存储在数据段,那么其大小就相当于struct T{int a; int b;};的大小。如果没有任何数据成员,sizeof会返回
2010-08-23 12:31:00
292
原创 Linux 简单的字符文件驱动
<br />字符设备是Linux 设备驱动中最简单的。<br />struct cdev<br />{<br /> struct kobject *kobj;<br /> struct module *owner; //所属模块<br /> struct file_operations *ops;<br /> struct list_head_list;<br /> dev_t dev;<br /> unsigned int count;<br />};<br />1
2010-08-20 17:22:00
441
原创 Linux 内核模块之hello world
Linux系统内核运行于一个单独的保护区中,但是运行内核在运行时动态的添加或者删除代码,这些代码包括了相关的数据 函数入口 出口并被组合在一个单一的二进制镜像中,即可装载内核模块,简称为模块。一个最简单的模块组建过程如下://hello world 模块源码#include #include #include static int __init hello_init(){ printk("Hello World/n");}static void __exit hello_e
2010-08-18 16:00:00
364
原创 Linux 命令行参数解析
<br />1 getopt<br />#include <unistd.h><br /> int getopt(int argc, char * const argv[], const char *optstring);<br />extern char *optarg;<br />extern int optind, opterr, optopt;<br /> <br />argc argv是main函数的参数,optstring定义了命令行的使用方法。<br />比如你想这样使用一个命令:<br
2010-08-05 20:25:00
639
原创 Linux计时器
Linux中用户态可以使用的计时器主要有alarm和timer.timer可以提供更加精确的时间,alarm只能精确到秒。#include int getitimer(int which, struct itimerval *curr_value);int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value);struct itimerval { struct t
2010-08-02 11:21:00
4189
原创 Linux信号的使用
信号是软件中断,信号提供了一种处理异步事件的方法。1 signal函数#include void (* signal(int signo, void (*func)(int) ) ) (int);通过typedef 可以使得该函数的形式比较简单。typedef void sigfunc(int);sigfunc *signal(int signo, sigfunc *func);该函数使得当进程收到指定的信号时调用对应的函数。func的值为SIG_IGN(忽略),SIG_DFL(默认),或者对应的函数地址
2010-07-29 19:57:00
2220
原创 Linux进程通信--信号量
Semaphores 信号量主要用于进程对共享资源的互斥访问。为了取得对一个共享资源,进程测试信号量的值,如果为正,表示还有资源可以访问,该进程对信号量加减一。如果为0表示没有资源可以用,该进程应当休眠等待信号量的值再次为正。Linux中的信号量使用起来是比较麻烦的。在这里,信号量是以集合形式存在的,创建时要给出信号量的数目,并且信号量集合即使没有任何进程访问时,也是存在于系统中的。要注意对其的销毁工作。每个信号量由以下结构体定义:struct {unsigned short semval; //信号量的
2010-07-29 15:43:00
870
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人