分类目录归档:语言

hash表取模技巧

在使用hash表的时候,由于hash表的size不可能无限大,我们必须将hash function求出来的index值映射到hash表的size范围内。一般情况下都是采取取模的形式index % size,但是modulus操作要进行除法运算,在数据量大的时候效率较低,这时候我们可以将size设置为2的某次方,这样只要将index & (size – 1)就可以求得模值,至于为什么是这样,原理很简单,我就不在此赘述了。

malloc出现segment fault

昨天,我的同事在运行移植Linux后的游服时出现了一个问题,在一个函数中用new创建对象时居然出现了segment fault,查看调用堆栈发现异常是出现在malloc函数中。
用gdb检查不出问题,用valgrid也无法定位出错的具体位置。
直接在函数中调用malloc(),发现用malloc()有时候出现段错误,有时候又不会,初步估计是程序在之前的流程中内存越界,破坏了malloc函数使用的记录内存块信息的结构体,造成分配一些大小内存时,内存访问异常。但是具体的问题还在研究当中。。。

_stdcall与_cdel及_fastcall区别(以及什么是平衡堆栈)

最近忙着实习,好久没写博文了,赶紧来补一个。
我们在写c/c++程序时都会用到函数,那么函数在调用时怎么保存参数,怎么执行调用呢。
CISC(如x86)机器上由于寄存器个数有限,参数使用堆栈来保存。而保存参数的顺序,在哪里平衡堆栈(清理参数)的约定称作calling convention(调用方法)。
c/c++上我们可以在函数开头通过_cdel _stdcall _fastcall等标记来指定函数的调用方法。c/c++默认的调用方法_cdel。
继续阅读