
C/C++
文章平均质量分 66
ps_e_udo
在读硕士研究生
展开
-
DLL中调用约定和名称修饰(三)
2、C++编译时函数(非类成员函数)名称修饰当函数使用__cdecl调用约定时,编译器进行以下工作: 1.以?标识函数名的开始,后跟函数名;2.函数名后面以@@YA标识开始,后跟返回值和参数表;3.当函数的返回值或者参数与C++类无关的时候,返回值和参数表以下列代号表示: B:constD:charE:unsigned charF:shor转载 2009-05-04 11:30:00 · 567 阅读 · 0 评论 -
DLL中调用约定和名称修饰(二)
4、thiscallthiscall调用约定是C++中的非静态类成员函数的默认调用约定。thiscall只能被编译器使用,没有相应的关键字,因此不能被程序员指定。采用thiscall约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,只是另外通过ECX寄存器传送一个额外的参数:this指针。 这次的例子中将定义一个类,并在类中定义一个成员函数,代码如转载 2009-05-04 11:29:00 · 556 阅读 · 0 评论 -
VC运行库详解
许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,那么本文就试图为大家彻底解开关于它的种种疑惑。 大家都知道,从转载 2010-05-18 14:07:00 · 2279 阅读 · 1 评论 -
Visual Studio性能分析器所使用的性能分析方法解释
性能分析解释使用采样方法进行分析时,分析器以一种类似于调试程序的方式附加到正在运行的进程。然后,分析器会定期中断进程并检查哪个函数处于堆栈顶部以及该函数的代码路径。换句话说,Visual Studio 分析器收集当前进程状态的样本。采样是一种非入侵式统计型分析方法。在函数中收集的样本越多,函数可能执行的处理就越多。Visual Studio 分析器还会收集有关导致此执行的调用路径的信息。因此,此工具可在分析收集的数据后显示整个调用堆栈。默认情况下,Visual Studio 分析器每 1 千万个 CPU 周转载 2010-11-26 16:14:00 · 2561 阅读 · 0 评论 -
vector中循环删除
很普通的算法,在一个循环中检查每个元素,判断条件,如果为真,就删除这个节点,再继续循环。看似简单,但是却一个不大不小的陷阱,这种小问题的结论,总是记不住,每次遇到的时候,都得写一个测试程序来验证,干脆总结一下,做个结论。最简单的方法std::remove_if(_First, _Last, Predicate)STL是用模板实现,简单高效,但是很多情况下,需要在循环中处理其他逻辑,不能直接使用这个函数用erase删除erase有两种原型,删除一个节点和区段删除,对于vector和list,这个操作的定义都是转载 2010-10-31 11:19:00 · 3729 阅读 · 0 评论 -
函数调用规范__cdecl和__stdcall的区别一目了然(表格形式)
__cdecl__stdcallC 和 C++ 程序的缺省调用规范为了使用这种调用规范,需要你明确的加上__stdcall (或 WINAPI )文字。即 return-type__stdcall function-name[(argument-list)]在被调用函数 (Callee) 返回后,由调用方(Caller) 调整堆栈。1. 调用方的函数调用2. 被调用函数的执行3. 被调用函数的结果返回4. 调用方清除调整堆栈在被调用函数 (Callee) 返回前,由被调用函数(转载 2010-10-31 12:29:00 · 612 阅读 · 0 评论 -
尾调用(Tail Call)和尾递归(Tail Recursive)
Tail Call(尾调用)是指在调用函数时直接将被调函数的返回值作为调用函数的返回值返回。如果这个调用是调用了调用函数本身(递归调用),这叫做Tail Recursive(尾递归)。使用尾调用的一个优点在于它不消耗额外的调用栈空间,它可以替换当前的栈帧。因此,使用尾调用来替换标准的调用被称作Tail Call Elimination(尾调用消除),或者Tail Call Optimization(尾调用优化)。原创 2010-10-31 09:57:00 · 9012 阅读 · 2 评论