随笔分类 - C_C++
摘要:WM_COPYDATA消息,在win32中用来进行进程间的数据传输。typedef struct tagCOPYDATASTRUCT { // cds DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATASTRUCT;其中...
阅读全文
摘要:昨天看Q3的代码,看到有个_INTSAIZEOF的宏,着实晕了一阵。一番google后,终于明白,这个宏的作用是求出变量占用内存空间的大小,先看看_INTSAIZEOF的定义吧:#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(s...
阅读全文
摘要:最近在进行监控平台的设计,之前一直觉得C/C++中最棘手的部分是内存的管理上,远不止new/delete、malloc/free这么简单。随着代码量的递增,程序结构复杂度的提高。各种内存方面的问题悄然滋生。而且作为平台,后期的插件扩展在所难免。长时间运行的采集平台的特性更是提出了对稳定性的高要求。不是c#、java,没有虚拟机为你管理内存,一切都要靠自己。于是想看看nginx、python、lua这些C的经典之作在内存管理这块“要地”又是如何处理的。 先来看看nginx吧,因为网上都说nginx的内存池设计的非常精巧:1、基本结构先来学习一下nginx内存池的几个主要数据结构:[见:./src
阅读全文
摘要:写这篇博客源于在阅读lighttpd源代码是遇到的一个关于assert应用的疑问。在阅读lighttpd源代码时,发现比比皆是的对malloc的调用结果进行assert检查,比如:Buffer.c:buffer* buffer_init(void) { buffer *b; b = malloc(sizeof(*b)); assert(b); b->ptr = NULL; b->size = 0; b->used = 0; return b;}这里的assert(b)似乎有问题,实际release版本在运行中难道不会发生malloc返回NULL的情况吗...
阅读全文
摘要:关于哈希表C实现,写了两篇学习笔记,不过似乎网上流传最具传奇色彩的莫过于暴雪公司的魔兽文件打包管理器里的hashTable的实现了;在冲突方面的处理方面,采用线性探测再散列。在添加和查找过程中进行了三次哈希,第一个哈希值用来查找,后两个哈希值用来校验,这样可以大大减少冲突的几率。在网上找了相关代码,但不知道其来源是否地道:StringHash.h 1 #include <StdAfx.h> 2 #include <string> 3 4 using namespace std; 5 6 #pragma once 7 8 #define MAXTABLELEN 1024
阅读全文
摘要:上次大致分析了一下哈希表的链地址法的实现,今天来分析一下另一种解决哈希冲突的做法,即为每个Hash值,建立一个Hash桶(Bucket),桶的容量是固定的,也就是只能处理固定次数的冲突,如1048576个Hash桶,每个桶中有4个表项(Entry),总计4M个表项。其实这两种的实现思路雷同,就是对Hash表中每个Hash值建立一个冲突表,即将冲突的几个记录以表的形式存储在其中;废话不多说,上代码和图示基本能说明清楚:完整的代码,请看:这里,一位圣安德鲁斯大学的讲师:KRISTENSSON博客这里截取几个主要的片段:主要的数据结构:struct Pair { char *key; c...
阅读全文
摘要:哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。具体的介绍网上有很详细的描述,如闲聊哈希表 ,这里就不再累述了;哈希表在像Java、C#等语言中是与生俱来的。可是在C的世界中,似乎只有自己动手,丰衣足食;在网上google了一把,大致有几个版本,我会一一来分析对比;首先先来交代一下哈希表实现中需要注意的一些概念:(主要参考:这里)哈希函数也叫散列函数,即:根据key,计算出key对应记录的储存位置 position = f(key)散列函数满足以下的条件:1、对输
阅读全文