摘要:/*智能指针:auto_ptr 定义在memory模块里&&std命名空间里一旦执行对象的指针,生存期结束,就会释放自己所指向的对象*/#include #include //cstdio即 C语言的stdio.h#include using namespace std;class X{public: X(){printf("X!\n");} ~X(){printf("~X\n");} virtual void say(){printf("hello!\n");}};class Y : public X{public:
阅读全文
摘要:看了kent的实现模式,对代码抽象层次有了一点理解,kent首先问了一个问题,下面的代码有神马问题?void compute(){ int flag = input(); flag |= 1; output(flag);}粗看来没有,但其实不然,但其实,input和output已经是高层抽象了,例如你并不知道输入来自于何方,到底是键盘输入呢,还是文件输入,又或者是网络输入,同样output也是如此,但是中间设置flag的语句则是一个低层抽象,如果整个函数都是低层抽象,代码应该是这样:void compute(){ extern char *s; int fl...
阅读全文
摘要:腾讯电商面试回来,发现我太菜了,缺乏技术深度。笔试题感觉不难,但是做了之后总是发觉少点什么东西,深度!这是这场面试总结出来的。凭记忆分享下笔试,面试题。大家一起解决,然后分享下该看什么书,可以解决这些“深度”问题。1.内存池算法。我就把前段时间看到的tcmalloc实现大概写了一遍。Q:malloc怎么实现的?A:通过brk,sbrk实现的。Q:sbrk,brk怎么实现的?sbrk,brk怎么由内核态切换到系统(用户?)态的?2.怎么定位内存泄露?我写的是:1.使用valgrind --这个东西从来没用过2.mtrace3.封装malloc,free函数的宏5./proc/$pid/下的内存.
阅读全文
摘要:学习程序的好方法是阅读代码和改进代码。下面的程例来自《An Overview of the C++ Programming Language》(5.1 异常和错误处理)程序用途:使用C++的异常机制,报告stack的上溢或者下溢。(我适当的把代码补全。)version 1 演示了基本的异常用法。从try里抛出一个异常(实例或对象),由catch里的类接受。1version12//From:AnOverviewoftheC++ProgrammingLanguage34#include5#include6#include7usingnamespacestd;89templateclassStack
阅读全文
摘要:C++的try-catch不拦截硬件异常(例如除数为0的异常)只拦截软件异常C++的异常可以按调用层次逐层返回,直到遇到可以拦截它的异常处理代码C++的catch(...)可以拦截全部的软件异常C++发生异常并被拦截时,并不能自动释放从堆上申请的内存 (这样的话或许每个代码层次都需要try-catch)C++的catch块并不能看到try块里定义的变量,如果catch块要访问这些变量,要把变量定义在try-catch同一层C语言的__try - __catch可以拦截到 硬件异常C#的异常处理似乎可以拦截硬件异常(至少除数为0的异常可以被拦截)C#的异常也是逐层返回,直到遇到可以拦截他的异常处
阅读全文
摘要:http://blog.jobbole.com/1198/代码之美,不仅在于为一个给定问题找到解决方案,而且还在代码的简单性、有效性、紧凑性和效率(内存)。代码设计比实际执行更难 。因此,每一个程序员当用C语言编程时,都应该记着这些东西。本文向你介绍规范你的C代码的10种方法。0. 避免不必要的函数调用考虑下面的2个函数:12345678910111213141516171819202122232425262728void str_print( char *str ){int i;for ( i = 0; i < strlen ( str ); i++ ) {printf("%
阅读全文
摘要:i was wrong! 虽然setbuf可以让程序自己管理缓冲,但是像getchar,gets这些标准IO函数还是要通过隐藏的stdin进行操作,而stdin是啥呢?还是一个FILE*,而FILE*自己内部有很多东西比如记录下一个字符的位置,有没有读尽缓存,因此直接通过memset去清除缓存还是很野蛮的动作,比较危险,但是文章也还有点价值,我实在是不舍得删,就先写一段放在这里吧#include #include int main(int argc, char *argv[]){ char buffer[1024] = {0}; gets(buffer); printf("%s\n&
阅读全文
摘要:用思维导图整理:代码:#include #include #include int main(){ /* 标准库直接支持 */ //获得运行程序的机器时间,并直接从time_t打印时间 time_t t = time(NULL); printf("%s\n",ctime(&t)); //从time_t转换成为struct tm,使用struct tm打印时间 struct tm *ptm = localtime(&t); printf("%s\n",asctime(ptm)); //自定义打印时间样式 const int BUF_S...
阅读全文
摘要:代码如下:#include #include typedef char String[32];typedef FILE* File;typedef struct _Employee { String name; int age; int salary; struct _Employee *next;} *Employee;typedef void (*Callback)(Employee);/* High Order Functions */void foreach(Employee e, Callback fn) { Emplo...
阅读全文
摘要:http://www.ruanyifeng.com/blog/2012/04/functional_programming.html作者:阮一峰日期:2012年4月 6日诞生50多年之后,函数式编程(functional programming)开始获得越来越多的关注。不仅最古老的函数式语言Lisp重获青春,而且新的函数式语言层出不穷,比如Erlang、clojure、Scala、F#等等。目前最当红的Python、Ruby、Javascript,对函数式编程的支持都很强,就连老牌的面向对象的Java、面向过程的PHP,都忙不迭地加入对匿名函数的支持。越来越多的迹象表明,函数式编程已经不再是学
阅读全文
摘要:因为缓存数据的buffer总是不够大(会引起段错误)索性从堆上拿了两块大内存/*功能说明:逐日存储来访用户(使用伯克利DB)根据存储的用户信息确定某用户是否是首次来访用户(未被存储的伯克利DB)调用方式1: 查询游客在2013年8月8日是否访问了指定渠道./channeldb -s "bch2000 guest:123456789" 20130808调用方式2:将指定文件里的用户信息写入DB,同时将该文件里的首次访问用户写入日志./channeldb -f 20130809 ./clog/20130809.log 20130809*/#include #include #i
阅读全文
摘要:gcc -o channeldb channel.c -db -Wall# -Wall参数等价于执行lint,即:进行代码的静态分析,它可以指出未初始化的变量,未使用的变量#include #include #include #include #include #include #include //define DATABASE "/work/stat/read/newstat/data/userlist/historydb/channel.db"#define DATABASE "/mnt/disk1/ucshuqi/touch/userlist/histor
阅读全文
摘要:http://blog.sina.com.cn/s/blog_502c8cc40100yqkj.htmlNoSQL是现在互联网Web2.0时代备受关注的技术之一,被用来存储大量的非关系型的数据。Berkeley DB作为一款优秀的Key/Value存储引擎自然也在讨论之列。最近使用BDB来发一个KV系统,并将这段时间的BDB的学习和使用经验记录如下。(项目中使用了BDB的4.8.30版本,本文所有涉及的具体问题都基于该版本)。1. Berkeley DB的简介Berkeley DB(BDB)是一个高性能的嵌入式数据库编程库(引擎),它可以用来保存任意类型的键/值对(Key/Value Pair
阅读全文
摘要:#编译程序gcc -o historydb historydb.c -ldb#将2013年8月9日的用户记录写入数据库 (程序自动识别新用户入库,跳过老用户)./historydb -f 20130809.userlist 20130809#查询guest1985215666654在2013年8月8日有没有访问业务bch2000./historydb -s "bch2000 guest1985215666654" 20130808#include #include #include #include #include #include #include #define DA
阅读全文
摘要:编译命令gcc -o dbwriter dbwriter.c -ldbdbwriter.c#include #include #include #include #include #define DATABASE "demo.db"/* 功能:解析日志提取数据(pv)日志格式:pp.cn guest:123456 100*/int parseLog(char *s,char **pv){ int flag = 0; while(*s) { if(*s==' ') { ...
阅读全文
摘要:面向对象编程不是银弹。大部分场合,我对面向对象的使用非常谨慎,能不用则不用。相关的讨论就不展开了。但是,某些场合下,采用面向对象的确是比较好的方案。比如 UI 框架,又比如 3d 渲染引擎中的场景管理。C 语言对面向对象编程并没有原生支持,但没有原生支持并不等于不适合用 C 写面向对象程序。反而,我们对具体实现方式有更多的选择。大部分用 C 写面向对象程序的程序员受 C++ 影响颇深。企图用宏模拟出一个常见 C++ 编译器已经实现的对象模型。于我愚见,这并不是一个好的方向。C++ 的对象模型,本质上是为了追求实现层的性能,并直接体现出来。就有如在 C++ 中被滥用的 inline ,的确有效,
阅读全文
摘要:我倒是不追求代码和C++相似,但是应该追求简洁的代码,下面是一个新的尝试shape.h#ifndef SHAPE_H#define SHAPE_Htypedef struct shape_t { void *shapeData; void (*area)(void *); void (*release)(void *);}Shape;void release(void *shape);#endifshape.c#include #include "shape.h"void release(void *shape){ free(((Shape*)shape)->shap
阅读全文
摘要:写版本2的原因,还是发现在不同的具体图形模块里发现了重复的release代码,这是坏味道,所以还是决定消除这些重复代码,DRY!shape.h#ifndef SHAPE_H#define SHAPE_Htypedef struct shape_t { void *shapeData; void (*area)(void *); void (*release)(void *);}Shape;void release(void *shape);#endifshape.c#include #include "shape.h"void release(void *shape){ .
阅读全文
摘要:我倒不是为了OOP而OOP,实在是OOP的一些特征,例如封装,多态其实是软件工程思想,这些思想不分语言,遵循了这些思想可以使得程序更有弹性,更易修改和维护,避免僵化,脆弱shape.h该文件定义的是图形接口,所有具体图形都必须实现自己计算面积,周长等API#ifndef SHAPE_H#define SHAPE_Htypedef struct shape_t { void *shapeData; void (*area)(void *); void (*release)(void *);}Shape;#endifcircle.h 圆形接口#ifndef CIRCLE_H#de...
阅读全文
摘要:CFANS·镇宅神兽(58135482) 16:30:15 我入手了macbook air非常路<luzte@qq.com> 16:30:29 你入手前可以问我CFANS·镇宅神兽(58135482) 16:30:33 结果想要编译APUE代码,用来学习非常路<luzte@qq.com> 16:30:38 我可以介绍较为便宜的水货CFANS·镇宅神兽(58135482) 16:30:48 结果怎么都不行非常路<luzte@qq.com> 16:31:00 你的是第二版的教材吗?CFANS·镇宅神兽(58135482)
阅读全文