c/c++
interhanchi
这个作者很懒,什么都没留下…
展开
-
诡异的宏问题
[code]#include #define f(i) {printf("%d",i);}void main(){ f(5);}[/code]这个会打印出5;然后紧接着修改程序;[code]#include #define printf_ex(x) printf xvoid main(){ f(5);}[/code]...2007-05-15 14:58:15 · 94 阅读 · 0 评论 -
linux下检测ip冲突
原理其实很简单,那就是广播一个arp包,然后recv,如果没有数据(这里要设置延时),那么说明这个ip是可用的,否则就检测这个数据是否为回复我们发出的arp的应答包.如果是则证明ip已被使用,否则继续等待.这里可以看下busybox的dhcp中的检测程序。networking/udhcp/arpping.c[code="c"]/* vi: set sw=4 ts=4: */...2008-11-16 20:18:41 · 215 阅读 · 0 评论 -
代码大全读书笔记1
这么好的书,觉得写点东西,记录一下比较好。4.1选择编程语言。程序员使用熟悉的编程语言生产率高于使用不熟悉的编程语言,并且高级语言比低级语言的效率要高得多,作者列出了几种高级语言的每一行代码与等效的c语言代码行数之比。比如java是2.5,而perl和python就是6.而且编程语言影响程序员的思维随处可见,作者举了个他遇到的项目,那就是一群fortran程序员去写c++,最后写出...2008-04-26 19:16:41 · 91 阅读 · 0 评论 -
gcc的几个自动优化
我的gcc版本是4.4.1先来看const和define以及enum定义,编译器会做什么样的优化:[code="java"]enum { constant=23 };#define CONSTANT 23static const int Static_Constant=23;const int Constant = 23;int foo() { a(...2009-11-10 00:44:59 · 385 阅读 · 0 评论 -
libevent源码浅析(四)
最近刚刚一个项目自己用libevent,因此这几天又把libevent的代码拿出来翻了下,当初看的时候有些似是而非的东西,这次是基本没有了。这篇也算是前面几篇libevent的blog的补充了。[code="java"]struct event_base { const struct eventop *evsel; void *evbase; int event_count...2009-05-15 23:02:27 · 131 阅读 · 0 评论 -
linux下的数据对齐
数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐。比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址最后两位是0.对齐方式是依赖于硬件的,有些架构对于数据的对齐要求很严格。如果这些系统装载进了没有对齐的数据将会引起一个processor trap.而有些系统则很安全,不过会使性能降低。...2008-11-25 12:15:07 · 1030 阅读 · 0 评论 -
linux下的管理内存相关的函数
[img]/upload/attachment/53603/aa2d5991-7414-3117-867b-c6bd2e86d30e.bmp[/img]malloc的实现,在linux下的实现是这样的,当所需要分配的内存大于128k,会用mmap(匿名映射)来实现。小于128k使用在堆分配(改天会分析下malloc函数的源码实现)。这里还有几个mallopt...2008-11-27 00:56:16 · 127 阅读 · 0 评论 -
php的c扩展
在php中最核心的一个数据结构就是这个:[code="java"]typedef union _zvalue_value { long lval; /* long value */ double dval; /* double value */ struct { char *val; int len; } str; HashTable *ht;...2008-12-07 18:24:37 · 523 阅读 · 0 评论 -
linux下的elf结构
[img]/upload/attachment/58875/d209d0c8-9704-325f-9933-bf7843dd86a8.jpg[/img]可以看到链接器和加载器看待elf是完全不同的,链接器看到的是由区段头部表描述的一系列逻辑区段的集合(也就是说它忽略了程序头部表)。而加载器则是看成是由程序头部表描述的一系列的段的集合(忽略了区段头部表)。elf它可以表示不同...2008-12-12 00:20:13 · 154 阅读 · 0 评论 -
libev简单使用介绍
更详细的用法请看他的文档:http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod[code="java"]struct ev_loop *ev_default_loop (unsigned int flags)struct ev_loop *ev_loop_new (unsigned int flags)[/code]...2008-12-30 09:52:27 · 375 阅读 · 0 评论 -
linux下的time处理
在内核中有3个不同的时间:Wall time(real time), Process time和Monotonic time.Wall time,也就是rtc时钟。Process time,进程执行的时间。Monotonic time,也就是系统从boot后到当前的时间。表示时间的数据结构: [code="java"]typedef __timer_...2009-01-04 18:02:09 · 137 阅读 · 0 评论 -
libevent源码浅析(一)
这里分析的是libevent-1.4.9。PS:前面还看了libev的源代码,妈的,那代码写的太猥亵了,相比较libevent代码写的好多了。。首先来看一下最主要的几个数据结构:eventop结构体是所有事件驱动模型的基类。所有的io复用类型都会实现此结构体里各种方法。[code="java"]struct eventop { const char *name;...2009-02-14 13:23:49 · 622 阅读 · 0 评论 -
libevent源码浅析(二)
我们来看下libevent的定时器的实现在libevent中定时器的实现是通过基于最小堆的优先级队列来实现的。对于这两个数据结构比较陌生的可以去翻算法导论的6.5节。主要的源码都在min_heap.c中。我们先来看主要的数据结构:[code="java"]typedef struct min_heap{ struct event** p; ...2009-02-22 00:11:48 · 132 阅读 · 0 评论 -
glibc中strlen的实现
glibc中的strlen的实现主要的思想就是每次检测4个字节(long int)。这样的话就降低了循环的次数,从而从整体上提高了效率。这里它使用了两个技巧,一个是由于传进来的字符串的地址有可能不是4字节(long int)对其的,因此首先需要遍历字符串从而找到4字节对其的那个地址。然后再进行比较.第二个技巧就是如何高效的判断4个字节中是否有字节为0.下来来看源码,这个源码...2009-08-04 09:10:22 · 212 阅读 · 0 评论 -
今天碰到的一个问题
将位图用 bmptopnm 转成pcl6的打印语言,然后直接cat 到打印机,用管道做的,没想到文件过大的时候,管道会有延迟,这时打印机就直接傻逼,然后就将数据分别打印出来了。最后解决只能先生成pcl文件,然后再直接cat出去。。...2008-10-29 22:33:08 · 101 阅读 · 0 评论 -
一些胡思乱想
比如很简单的一个斐波那契数列,如果纯粹从数学上来说,那就是[quote]f(n)=f(n-1)+f(n-2)当n>1时,而n=0时f(n)=0,当n=1时,f(n)=1[/quote]很容易我们就可以直接翻译为程序:[code="java"](define (f n) (cond ((= n 0) 0) ((= n 1) 1) ...2008-03-19 22:41:01 · 77 阅读 · 0 评论 -
指针与数组的异同
指针是c的灵魂,俺这里只能抛砖引玉了. 1 首先,数组名不能当作赋值对象,比如下面的代码:[code]char *s="abc"; char *s1="bcd"; s1=s; printf("%c\n",s1[0]);[/code]可以正常运行,如果把 这边的指针变为数组就会出错。2 下面阐述一下,指针和数组各自是如何访问的:[code]char...2007-05-18 16:10:11 · 128 阅读 · 0 评论 -
google的一道面试题。
这个题目的英文原题是:[quote]Consider a function which, for a given whole number n, returns the number of ones required when writing out all numbers between 0 and n. For example, f(13)=6. Notice that f(1...2005-10-18 14:05:23 · 124 阅读 · 0 评论 -
[转帖]MISRA--作为工业标准的C编程规范
本文档转贴自孟岩的blog:http://blog.csdn.net/myan/archive/2002/12/26/1919.aspx MISRA--作为工业标准的C编程规范 MISRA (The Motor Industry Software Reliability Association汽车工业软件可靠性联会)是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产...原创 2008-08-21 13:19:44 · 160 阅读 · 0 评论 -
gcc对c语言中的switch的优化
在c语言中switch语句会被实现为一个跳转表,跳转表是一个数组,这个数组里面存的都是地址,也就是说只要你传递给它一个i,他就会返回给你,你所需要跳转的地址,这样做得好处就是执行语句的时间和条件的个数无关..不过在gcc里面他也只是条件数大于4个,才会生成这个跳转表.请看下面的代码:[code]int switch_eg(int x) { int result = x;...2007-12-08 03:10:43 · 861 阅读 · 0 评论 -
谈一下switch语句中的jump table
gcc对c语言中的switch的优化 在这里:http://simohayha.iteye.com/admin/show/146825接着用上次的代码 switch.c[code]int switch_eg(int x) { int result = x; switch (x) { case 100: result *= 13;...2007-12-09 17:13:17 · 832 阅读 · 0 评论 -
理解缓冲区溢出
这几天一直在做csapp里面的3.38,他是让你自己实现一个缓冲区溢出程序.代码如下:[code]/* Bomb program that is solved using a buffer overflow attack */#include #include #include /* Like gets, except that characters are typ...2007-12-12 22:45:35 · 172 阅读 · 0 评论 -
类型系统的四种维度
原文在这里: http://programming.reddit.com/info/63tnv/comments/c02qx55 Latent typing是一种你不需要在源码中的明确的声明你的变量的类型的类型系统.而与之相反的是manifest typing,它需要你在源码中明确的声明你的变量的类型。 Static typing类型系统指的是你的源码中的任何独立的表达式都...2007-12-29 00:53:43 · 450 阅读 · 0 评论 -
libevent源码浅析(三)
这次我们来看libevent的信号的处理。在libevent中通过使用socketpair建立一对流管道,也就是全双工管道,来将信号事件与句柄事件统一起来。先来看数据结构:[code="java"]struct evsignal_info { struct event ev_signal; ///sig.evsignal_caught = 0; memset(&...2009-03-17 00:08:25 · 181 阅读 · 0 评论 -
看代码看的头晕
最近工作需要在看ghostscript的代码,看得我头晕眼花,goto真不是个好东西...原创 2008-09-06 01:04:38 · 556 阅读 · 0 评论 -
GUN C正则表达式
最近项目中要处理文本,因此就用了gun的正则表达式,它是posix风格的..我们一般使用的都是perl风格的,所以一开始使用可能会有一些不习惯.详细的区别可以在wiki上看到:http://en.wikipedia.org/wiki/Regular_expression头文件是regex.h可以在里面看到他所提供的接口.这里主要是3个函数和一个结构体:[quote]int ...2008-09-25 23:47:11 · 344 阅读 · 0 评论 -
发现了一个好东西LLVM
LLVM全称是 Low Level Virtual Machine[quote]LLVM is a robust system, particularly well suited for developing new mid-level language-independent analyses and optimizations of all sorts, including those...2008-03-07 11:56:25 · 203 阅读 · 0 评论 -
ftruncate和msync
[code="c"]int ftruncate(int fd, off_t length)int msync(void *addr, size_t len, int flags)[/code]首先,man手册里面ftruncate说是当length大于文件本身的大小的话,会扩大文件的话并补'\0'的,可是我在arm-linu-gcc 3.4下却不是。还有就是msync...2008-10-23 22:10:34 · 190 阅读 · 0 评论 -
gdb学习笔记(一)
这里只是一个摘要。具体的细节还需要去看manual。1 info 用来描述你的程序的状态,比如info b就是显示出当前的程序的所有断点.2 set 用来设置一些环境变量的值,比如set prompt $.3 show用来描述gdb自己的状态.编译要用-g选项.然后用gdb +程序名,或者直接gdb后,用file + 文件名加载程序....2009-10-17 14:11:54 · 246 阅读 · 0 评论 -
ydb的内存模型
[url=http://arbow.iteye.com]阿宝[/url]同学推荐了这个东西,因此周末就大概看了下源码,这里就简要的分析下它的实现,下面是他的特性。项目地址在这里:http://code.google.com/p/ydb/[quote]# YDB is a key-value storage library.# Simple API, only 6 met...2009-09-06 18:02:02 · 113 阅读 · 0 评论