C/C++
文章平均质量分 85
施工中请绕行
喜欢研究底层技术,编译原理,操作系统技术,数据库引擎实现原理。2012年校园招聘进入腾讯北分云平台部,从事终端开发职位。
展开
-
do...while(0)的妙用
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。 1. do...while(0)消除goto语句。通常,如果在一转载 2012-01-22 08:59:34 · 552 阅读 · 0 评论 -
实现一个基本的数据库
大概一年前的这个时候,为了深入了解数据库的内部原理和实现,我决定编写一个数据库系统的原型程序,这个行动断断续续坚持了一年,写了接近3W行C代码,现在除了事务和并发(只做到了存储引擎层面的并发),其他的功能基本都实现了。数据库是底层软件,实现起来有一定难度,为了编写这个程序(暂且就叫做XSQL吧),我阅读了很多关于开源数据库内部原理的书籍资料,总结了主流数据库的结构,然后依据其原理写出了XSQL。接原创 2013-05-20 16:31:26 · 1650 阅读 · 8 评论 -
fread-C语言是怎样读取文件的
原文:http://blog.csdn.net/xiaofengsheng/article/details/5370917为了效率的考虑,不至于频繁调用系统函数和访问IO设备,MSVC CRT的fread采用缓冲设计. C语言提供的关于缓冲的函数有:[cpp] view plaincopyint flush(FIL转载 2013-06-12 17:41:38 · 3621 阅读 · 0 评论 -
CreateFile函数详解
CreateFile The CreateFile function creates or opens the following objects and returns a handle that can be used to accessthe object:filespipesmailslotscommunications resourcesdisk device转载 2013-06-03 09:50:04 · 753 阅读 · 0 评论 -
VC与YACC、LEX集成
在这里,将介绍由英国Bumble-Bee Software公司生产的Windows环境下的YACC和LEX集成环境Parser Generator。Parser Generator是Windows下YACC和LEX的实现。它包括一个图形用户界面,同时包括YACC和Lex两个版本,分别叫做AYACC和Alex。Parser Generator非常适合于与VC++集成。 在安装了Parser G转载 2013-07-14 19:42:09 · 1085 阅读 · 0 评论 -
结构体最后的长度为0或者1的数组
在Linux系统里,/usr/include/linux/if_pppox.h里面有这样一个结构:struct pppoe_tag { __u16 tag_type; __u16 tag_len; char tag_data[0];} __attribute ((packed));最后一个成员为可变长的数组,对于TLV(Type-Len转载 2013-07-01 18:17:44 · 661 阅读 · 0 评论 -
64位时间戳实现
实现了64位时间戳,可以表示公元1年1月1日零时至9999年12月31日末时之间的时刻,精确到毫秒。/*----------------------------------------------------- Author: http://blog.csdn.net/xinghongduo E-Mail: [email protected] Description: 64位时间戳,可以原创 2013-07-20 10:00:05 · 12694 阅读 · 2 评论 -
调试的艺术——Debug技巧总结
Q1:Release版本不能调试吗?A1: Release版本、Debug版本的区别,据我目前所知有3处:编译是否“编译器优化”过;是否有完整调试信息;_DEBUG宏和NDEBUG宏;先说这三个选项的位置: “编译器优化”,VS2003里,位于 工程属性(在Solution Explorer面板的某个工程上点右键)-> C/C++ -> Optimization -> 第一项Optimiz转载 2013-10-05 19:47:40 · 1121 阅读 · 0 评论 -
AVL树实现
avl.h#ifndef avl_tree_h#define avl_tree_htypedef struct tree_node_t tree_node;struct tree_node_t { tree_node_t *left ,*right; struct { void *key; void *value; }kv; in原创 2013-10-14 18:37:58 · 1115 阅读 · 0 评论 -
求二进制最右为1的位是第几位
这段代码来自https://github.com/erlang/otp/blob/master/erts/emulator/sys/common/erl_mseg.cstatic const int debruijn[32] = { 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21,原创 2013-05-25 22:07:02 · 4614 阅读 · 1 评论 -
Linux内核源码分析方法
Linux内核源码分析方法一、内核源码之我见Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其转载 2013-03-20 18:07:54 · 1226 阅读 · 0 评论 -
程序在内存中运行的奥秘
内存管理是操作系统的核心功能,无论对于开发者还是系统管理员内存管理的重要性都是不言而喻的。我会在接下来的几篇文章通过计算机的实际运行过程谈谈内存管理,当然在必要的时候我也会从底层原理去阐释这个问题。我们提到的概念是不局限于平台特性的通用概念,不过为了阐述这些概念我们选取的实例大多来源于Linux和基于x86架构的32位Windows操作系统。这篇文章,我们首先来看看程序是如何使用内存的。转载 2012-07-09 09:03:29 · 964 阅读 · 1 评论 -
函数参数是如何传递的
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。 值传递(passl-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特转载 2012-08-07 12:53:27 · 1157 阅读 · 0 评论 -
C/C++内存布局详解
一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分:1、栈区(stack)存放局部变量、函数参数、返回数据、返回地址等。系统自动分配释放 ,其操作方式类似于数据结构中的栈。需要注意的有三点:第一, 退栈后销毁进栈时定义数据,请看下面这段。char* fun(char *p){char test[] = "转载 2012-08-11 08:48:55 · 882 阅读 · 0 评论 -
内存对齐2
操作系统的内存分配问题与内存对齐问题对于低层程序设计来说是非常重要的,对内存分配的理解直接影响到代码质量、正确率、效率以及程序员对内存使用情况、溢出、泄露等的判断力。而内存对齐是常常被忽略的问题,理解内存对齐原理及方法则有助于帮助程序员判断访问非法内存。2程序的内存分配问题一、一般C/C++程序占用的内存主要分为5种 1、栈区(stack):类似于堆栈,由程序自动创建转载 2012-08-11 11:50:54 · 773 阅读 · 0 评论 -
内存对齐
首先由一个程序引入话题:1 //环境:vc6 + windows sp22 //程序13 #include iostream>4 5 usingnamespace std;6 7 struct st18 {9 char a ;10 int b ;11 short c ;12 };13转载 2012-08-11 08:49:50 · 712 阅读 · 0 评论 -
POJ 1941 三角形分形
The Sierpinski FractalTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 2684 Accepted: 1240DescriptionConsider a regular triangular area, divide it into fou原创 2012-08-31 10:04:04 · 2817 阅读 · 0 评论 -
求一个类的sizeof应考虑的问题
昨天面试,面试官让我说一说求一个类的sizeof应该考虑的问题,心想,太好了,之前sizeof可是做了不少功夫,就说了类的非静态、非全局成员,如果有虚函数就要加上一个指向虚表的指针,4字节大小,然后说,大概是这样。面试官就问,虚函数的实现机制是?大概讲了一下虚表之类的东东,然后他问,那如果是虚继承呢,求sizeof还是一样的么?先是一愣,心想,妈呀,什么是虚继承呢,然后还是淡定地回了,应该也是一样转载 2012-10-11 06:44:25 · 953 阅读 · 0 评论 -
实现索引遇到的问题
这些问题是在实现索引时遇到的,我利用B+树实现了索引,整个索引包括以下三个部分:B+树结点,关键字和链接结点。B+树结点存储在索引页中。链接结点是为了解决重复关键字的问题而设计的,所有重复关键字的数据行在数据页的地址在B+树的叶结点以单链表的形式链接起来,其实就是拉链法解决冲突,整个链表保存在链接页中。 B+树的key域是一个64位的数据类型,只能保存整型或者实型的关键字原创 2013-04-03 10:26:13 · 4884 阅读 · 0 评论 -
VS2008性能分析工具
在过去十年间,涌现了许多新的软件技术和平台。每种新技术都要求掌握专门的知识才能创建出性能良好的应用程序。现在,由于各种 Internet 技术(如博客)使失望的用户可轻松地否定您的应用程序,因此您确实需要将性能放到首要位置。在计划早期,就应添加响应性能要求并创建原型来确定可能的技术限制。在整个开发过程中,还应衡量应用程序的各个性能方面以发现可能的性能下降,同时确保速度较慢情形下的测试人员文件并跟踪转载 2013-10-26 22:55:13 · 3975 阅读 · 0 评论