posted @ 2013-11-24 10:26
随笔分类 - c++基础知识
摘要:1.动机:前段时间,一直有个疑问,就是编译器是从哪里知道数据的类型的,数据的类型是存在内存里面的么,因为自己调试编译器,发现内存中并没有多余的数据,后来在群上发问,才知道数据在编译成汇编的过程就知道数据的类型了,也就是数据的类型识别时在内存代码区里 观察代码#include#includestruct data{ short a; long b; long long c; float e; double f; double g; bool h; char i;};int main(){ data temp; temp.a...
阅读全文
摘要:1. 出现字节对齐的动机:cpu的效率,内存的节省 话说第一次碰到字节对齐的时候是在今年六月实习的时候,有一次我在调用一个接口,把数据从那个借口复制过来,但是在那个借口的时候参数是正确的,一旦复制出来以后,参数就出错了,找了好久,后来大牛过来找了找,原来是在接口的时候数据是按一个字节对齐,接受的数据是取消指定对齐,所以就出问题了。 一般在内存充裕的时候我们是取消指定对齐的,因为这可以加快CPU的寻找数据的时间,因为 (比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就...
阅读全文
posted @ 2013-11-23 19:11
摘要:一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 4、文字常量区 —常量字符串就是放在这里的。 程序结束后...
阅读全文
posted @ 2013-11-23 11:58
摘要:最近写hashtable的实现的时候用模板类的思想,在普通int,long,double类型的时候测试时没问题的,当用到string的时候,一直有问题。 实现的equal函数是比较粗暴的使用两者所有对应内存字节是否相似来比较的。 bool equal(T a,T b){//用内存中字节的方法判断这块内存的对象的值是否相等,这样就不用关心结构内部的数据类型了 char *aCurret,*aEnd,*bCurret; aCurret=(char *)&a; aEnd=aCurret+sizeof(T); bCurret=(cha...
阅读全文
posted @ 2013-11-22 21:56
摘要:1. 问题提出最近在我们的项目当中,出现了两次与使用string相关的问题。1.1. 问题1:新代码引入的Bug前一段时间有一个老项目来一个新需求,我们新增了一些代码逻辑来处理这个新需求。测试阶段没有问题,但上线之后,偶尔会引起错误的逻辑输出甚至崩溃。这个问题困扰着我们很久。我们对新增代码做周详单元测试和集成测试都没有发现问题,最后只能逼迫我们去看那一大段未修改过原始代码逻辑。该项目中经常会碰到使用string,原始代码中有这样一段逻辑引起了我们的怀疑:1string string_info;2//... 对string_info的赋值操作3char* p = (char*)string_in
阅读全文
posted @ 2013-11-22 21:38
摘要:之前看了侯捷的STL剖析,感觉光看不顶用,还是自己实现一下比较好,之前还打算看数据挖掘机器学习,但现在明白了,我明年3月份就要出去了实习了,而数据挖掘之类的学习,还没人带,而且没个几年积累时间不太可能有收获。 还是好好在学学C++的底层实现,内存管理机制之类的,linux也要重头再学习!
阅读全文
posted @ 2013-11-21 23:16