转载:http://www.2cto.com/database/201211/172380.html  myisam和innodb索引实现的不同 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:   同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数 继续阅读 >>


刘瑜晗 16/03/26 20:27:22
转载:http://www.ruanyifeng.com/blog/2014/11/compiler.html 源码要运行,必须先转成二进制的机器码。这是编译器的任务。 比如,下面这段源码(假定文件名叫做test.c)。 #include <stdio.h> int main(void) { fputs("Hello, world!\n", stdout); return 0; } 要先用编译器处理一下,才能运行。 $ gcc test.c $ ./a.out Hello, world! 对于复杂的项目,编译过程还必须分成三步。 $ ./configure $ make $ make install 这些命令到底在干什么?大多数的书籍和资料,都语焉不详,只说这样就可以编译了,没有进一步的解释。 本文将介绍编译器的工作过程,也就是上面这三个命令各自的任务。我主要参考了Alex Smith的文章《Building C Projects》。需要声明的是,本文主要针对gcc编译 继续阅读 >>


刘瑜晗 16/03/26 17:33:49
   这是在面试中被问到的一个问题,回答了是。这问题第一感觉答案就是否定的,一时也没想出来理由只能回答了是。当时太紧张了,其实回想一下汇编语言就该想到程序的入口地址是可以指定的,c语言编译器默认以main作为入口地址。 网上查阅后,发现了 __attribute__ 这个关键字,它可以设置函数属性,变量属性,类型属性。 参考:http://www.cnblogs.com/Anker/p/3462363.html 看下面的例子: // gcc 编译器 #include<stdio.h> __attribute__((constructor)) void before_main() { printf("%s\n",__FUNCTION__); } __attribute__((destructor)) void after_main() { printf("%s\n",__FUNCTION__); } int main() { printf("%s\n",__FUNCTION__); return 0; } 继续阅读 >>


刘瑜晗 16/03/25 14:23:32
在静态成员函数出来之前就已经有了静态成员变量。静态成员变量是为了为用户提供在类级别上访问,而不是类对象有关的数据。静态成员变量在编译期就存在了,而不像非静态成员变量只有实例化了对象才会给分配内存。静态成员变量是所有类对象共享的,例如,我们可以为类定义一个 static int n 来统计实例化了多少个对象,对象构造时 n++ , 析构时 n– 。 但是,如果为类定义的静态成员变量是私有的(不希望暴露在类外),就会遇到下面的问题: class A { private: static int n; int b; }; 如果,我现在想在类外访问 n , 怎么办呢? 只能定义一个public 成员函数了: class A { public: int get_n() { return n; } private: static int n; int b; }; .. 继续阅读 >>


刘瑜晗 16/03/14 14:39:59
参阅: http://blog.csdn.net/ljianhui/article/details/46408645 环境:ubuntu15.04 、 gcc编译器 做个简单的笔记: 类内只保存非静态数据成员变量和虚函数表指针,虚函数表中按声明顺序依次保存所有的虚函数指针。其他的静态成员和静态成员函数、非静态成员函数在类外保存。 注:vptr 表示指向虚函数表的指针 虚函数表指针和类的非static成员变量相当于是结构体成员,要做内存对齐,所以有时候虚函数表指针和非static成员变量之间会有间隔。 单独的类 多继承 布局: 派生类中按照父类的继承顺序,依次是A的虚函数表、A的非static成员变量,B的虚函数表、B的非static成员变量。特别的,第一个父类的虚函数表的最后也记录了派生类的所有虚函数指针,还有,如果父类的虚函数被派生类重写,则直接将父类的虚函数指针替换为派生类的。派生类的非static成员变量排在最后。 多重继承 布局: 重复继承下的派生类布局规律与普通多继承是 继续阅读 >>


刘瑜晗 16/03/14 08:46:59
参考文章:http://www.cnblogs.com/zhuyp1015/p/3618863.html 我在这里总结一下: 查看正在执行的所有线程 info threads 切换到指定线程 thread ID //这里的ID是info threads后各线程前面的序号 break thread_test.c:123 thread all //在所有线程中相应的行上设置断点 thread apply all command //让所有被调试线程执行GDB命令command thread apply ID1 ID2 command //让一个或者多个线程执行GDB命令command 调试死锁流程 打开core文件生成 ulimit -c unlimited 编程源程序加 -g 选项 查看进程号 ps aux | grep a.out 终止进程 kill -11 进程id 查看core文件信息 gdb a.out core 继续阅读 >>


刘瑜晗 16/03/10 17:47:32
这里(IBM)给出了protobuf的基本介绍和原理 http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ 安装 开始按照上面IBM给出的文档安装了protobuf3.0版本,但是装完后生成的 .pb.cc 和 .pb.h 代码无法编译链接。不知道是静态链接库的问题还是源码包的问题。于是按照下面这篇博客成功安装了 protobuf2.6.1 。 http://www.cnblogs.com/javaee6/p/4849051.html 2.6.1 源码包 https://github.com/google/protobuf/releases/download/v2.6.1/protobuf-2.6.1.tar.gz 测试实例 lm.test.proto package lm; message test { required int32 id=1; required string str=2; } 将上面定义的数据格式生成c++代码 命令: prot 继续阅读 >>


刘瑜晗 16/02/22 13:04:41
发现一些小的知识点长期不用都得忘,决定再次遇到了一定要记录一下。 const 成员函数 const对象只能调用const成员函数。 const对象的值不能被修改,在const成员函数中修改const对象数据成员的值是语法错误 在const函数中调用非const成员函数是语法错误 任何不会修改数据成员的函数都应该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其它非const成员函数,编译器将指出错误,这无疑会提高程序的健壮性。 explicit 关键字 在构造函数前加explicit关键字禁止对象作隐式转换 #include<iostream> #include<string> class Buffer { public: explicit Buffer(std::string s) { str = s; std::cout<<s<<std::endl; } private: s 继续阅读 >>


刘瑜晗 16/01/28 19:42:54
在阅读一些项目的源代码时,遇到了一些我平时很少见,但发现很有用的C语言语法,在此整理一下。 #undef 我们平时用的都是#define,突然遇到了这个。。。其实,#undef 与 #define 相对应。#undef 的作用是取消已经有的宏定义。 #include<stdio.h> #define MAX 5 int main() { #undef MAX // printf("%d\n",MAX); #define MAX 6 printf("%d\n",MAX); return 0; } 结果: 当取消第6行printf的注释,将会报错,‘MAX’ undeclared , 因为MAX宏被undef 取消了。 结构体中的可变长数组 char data[0]; 常见如下形式的定义: struct buf { int len; char data[0]; }; 这其实是实现了一个变长数组data,data只是一个数组名,初始 继续阅读 >>


刘瑜晗 16/01/27 23:23:52
转载:http://www.centoscn.com/CentOS/2013/0418/321.html 相信很多人已经看厌了Linux已成不变的命令提示符的颜色,多数人要么使用默认的绿色,要么在使用PUTTY的时候设置成绿色的,不知道是否有人想到提示符可以设置成其他的颜色呢,本文就说明命令提示符变量PS1的设置。 1、PS1变量简介 PS1是Linux终端用户的一个环境变量,用来说明命令行提示符的设置。 可以使用 man bash命令查看bash手册,找到该变量支持的特殊字符,以及这些特殊字符的意义:   \a     #an ASCII bell character (07)    \d     #the date in "Weekday Month Date" format&nb 继续阅读 >>


刘瑜晗 16/01/11 21:05:50