随笔分类 - C/C++
摘要:返回引用遵守的两条准则:1. 不能返回局部变量;2. 不能返回new出的量,因为可能是临时对象。const的用法:1. 基本数据类型的写限制;2. 函数的传入以及返回参数;3. 类内的数据成员以及成员函数的限制;4. 类对象的限制。
阅读全文
摘要:参考这,这。在函数调用前,会进行下面的操作:1. 将调用的参数,从右往左push进stack中;2. 将调用函数中被调函数的下一条指令作为返回地址push进stack中;3. 保存栈底指针,即push ebp,将保存栈底寄存器中的值push进stack;4. 将栈底指针更新为栈顶指针,即mov ebp, esp,就是讲被调函数的栈底指针移向调用函数的栈顶位置;5. 栈是从高地址向低地址延伸的,我的理解是,每次的栈分配大小是有限的,从高地址往后放,直接标记内存不可被占用。
阅读全文
摘要:结合这,这,就可以看懂了,知道了下面几个事实。1. 一个函数体内,初始时会初始化栈空间,用于存放变量,结束时会释放栈空间;2. return是将值放进eax寄存器,然后再将eax寄存器中的值返回给相应变量,这就可以解释返回指针其实只是返回了一个地址;3. 返回一个局部指针后,函数中的局部数组的内存已经被释放,然后内部的值并没有被清楚,只是标记说要删除,但重新访问时,就会进行清除,如下面的代码,这后面举得那个例子,对于输出的值,第一个是0,后面的是乱的也就解释通了。PS: 下面的运行结果,第一个可以正常返回,第二个返回空格字符。char * Cstr(void){ char a[10] =...
阅读全文
摘要:strlen的实现是通过4个字节4个字节进行枚举,然后通过位运算来判断这4个字节中是否有一个字节含有0,这样的话,效率就提高了4倍。这个效率提高是假设a&b&c&d与a&b有差不多效率的前提下。那用8字节8字节来偏移的话,是不是更快呢?32位机上不会,64位机上会提高一倍。因为a&b在64位下会提高一倍,因为32位的寄存器大小是32位的,对于分别MOV高位与低位两次。本来实验a&b&c&d与a&b的速度的,经实验验证,这两个效率确实是差不多的,然后去看汇编,看指令条数,在没有使用-O优化下,指令的条数差别跟运算符号的个数的
阅读全文
摘要:来源这里的关于数组指针的题目,参考这,这,经过下面的测试:#include #include using namespace std;void test() { char *a = "abc"; printf("%08x %08x\n", a, a + 1);}void test1() { int **a = new int*[10]; for (int i = 0; i < 10; i++) a[i] = new int[10]; for (int i = 0; i < 10; i++) { printf("%08x %08...
阅读全文
摘要:这提到抛出引用类异常,可是那个指针在try中就被释放了,后面就出现访问错误了,见下面代码:#include using namespace std;class Ex {private: int *id;public: Ex() { id = new int; } ~Ex() { delete id; id = NULL; } int errorId() { return *id; }};void fun() throw (Ex, Ex*) { Ex *ee = NULL; try { Ex ...
阅读全文
摘要:主要参考这篇博文,总结成下面几点:1. 根据操作系统及编译器不同有不同的对齐方式,代码中C的大小在mac下是16,在windows下是24;2. 除了int a:2这种类型的变量,其他变量存放的起始位置都是该变量的整数倍,包括该结构题的初始化内存地址;3. 由于上面这条规则,因此struct的大小是内部最大变量的整数倍;4. struct的嵌套可能被编译器优化成在一个struct中的情况;5. C和D的大小不一样,所以当int a:2以及int b:2这种相同类型的放在一起,可能直接被编译器优化成了int _a_b:4。#include struct B { char a[3];};st...
阅读全文
摘要:在抽取MinHeap的时候,涉及到重载,覆盖,虚函数等,有几点之前没注意到的问题在这里总结下:1. 覆盖(override)只要是函数同名就会被覆盖,子类指针若调用父类的同名不同参数的函数的话,会在编译时期报编译错误;2. 成员函数在编译时就确定该函数的所属类,同一个类的不同对象共享一份成员函数地址,根据指针的类型调用指定的成员函数,属于early bind;3. 虚函数采用late bind,就是在运行时才能确定具体调用的函数,根据this指向的内存空间类型,去对应的虚表中取对应的函数,通过同一个slot位置抽象;4. 成员函数的实现跟全局函数类似,找到该函数对应的逻辑代码段后,将this指
阅读全文
摘要:单继承时,除了数据以外,还有虚表指针;多继承时,为每个父类维护一个虚表指针,若子类有重定义,则直接覆盖在上面,否则放在第一张虚表后。虚继承的情况还不一样,因为没用过虚继承,就没仔细看了,参见这,这,这。
阅读全文
摘要:#include <iostream>using namespace std;template <typename T>class A {public: T x, y;public: A<T> operator-(const A<T> &t); template<typename T> friend A<T> operator+(const A<T> &x, const A<T> &y);public: A(); A(T t);};template <typename
阅读全文
摘要:用CxImage处理MFC下的图片读取、OpenGL显示、保存等操作,试了官网上的6.0.0以及7.0.1版本都不能用VS2010正常编译通过(cximage会对应分别编译出crt与mfc版本,mfc版本不能编译通过,原因是vs的环境不一致导致stdafx.h中的版本定义不一致),然而在这里若仅仅是对stdafx.h中相应宏的修改也不能使它编译通过。 后来在这看到,CxImage7.0.2版本的下载,该版本有vs2010的sln,照着作者的方法就可以编译成功,需要注意的是,若采用动态链接的话,debug下仅仅使用cximaged.lib,不需要把那些lib都加进来,release的话同理...
阅读全文
摘要:Visual Assist X + VsVimVisual Assist X常用快捷键见这。studiostyles vs配色方案
阅读全文
摘要:1. 下载本以为要下载QT-creator和QT-SDK,这提到只要SDK和VS2010的插件就可以,于是下了:qt-win-opensource-4.8.2-vs2010.exeqt-vs-addin-1.1.11-opensource.exe这里的SDK要选择VS2010编译的,要不然还得自己切换平台然后编译,会耗时好几个小时。2. 安装安装很简单,下一步,下一步就可以了。3. 配置需要在VS2010中配置QT的include、lib、bin,VS2010的Tools->Options->VC++ Directories跟原来的不一样,移到user property sheet
阅读全文
摘要:http://c.chinaitlab.com/special/sjms/Index.htmlhttp://www.cnblogs.com/userinterface/archive/2005/04/15/138074.html
阅读全文
摘要:1. 静态变量 今天总算弄了一点点贴图的程序了,想用顶点数组的方法来试试。记得前天晚上,做的一个试验不能跑出结果,今天才发现原来必须要用静态的类型呀,对这个方法的原理不了解导致的额。先说说关于静态变量这回事吧。 一开始,我想这样: 但这样会报链接错误:error LNK2001: 无法解析的外部符号 "public: static int NODE::a" (?a@NODE@@2HA)那是因为...
阅读全文

浙公网安备 33010602011771号