c/c++
zhaixh_89
这个作者很懒,什么都没留下…
展开
-
结构体字节对齐
http://hi.baidu.com/skyland_lee/blog/item/45604bca81e1928cc91768d7.html,这篇文章比较专业地分析了字节对齐在VC和GCC的特点,写得非常不错。这两天我在为毕业设计做准备,所以要花点时间研究字节对齐的问题。 文章中有这样一段话:Win32平台下的微软C编译器(cl.exe for 80×86)的对齐策略:1转载 2013-12-31 10:02:55 · 802 阅读 · 0 评论 -
观察者模式实现(模仿CSharpMessenger扩展)
我们在游戏开发中经常会用到这种模式,用于模块之间的消息分发,来降低模块之间耦合性,基本原来就是利用字符串作为key值来存储回调函数(大多数观察者模式使用字符串作为消息队列中的key值),分发消息时检索key值来获取回调函数并执行来达到模块之间交互的功能,为了实现消息类型拓展,这里我使用了类模板来实现,由于c++编译器对类模板的限制,因此类模板成员函数的实现我也放在了头文件中,代码之中不作说明头...原创 2018-12-04 17:47:00 · 233 阅读 · 0 评论 -
字符串拷贝操作函数原型实现
字符串拷贝函数char * strcpy(char *dst,const char *src) { if((dst==NULL)||(src==NULL)) return NULL; char *ret = dst; //[1] while ((*dst++=*src++)!='\0'); //[2] return ...原创 2018-05-17 14:17:51 · 636 阅读 · 0 评论 -
C++中placement new操作符(经典)
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; } 首先我们区分下几个容易混淆的关键词:new、operator...转载 2018-05-17 08:27:39 · 201 阅读 · 0 评论 -
C++中placement new操作符(经典)
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p; } 首先我们区分下几个容易混淆的关键词:new、operator...转载 2018-03-17 12:32:16 · 198 阅读 · 0 评论 -
浅谈C/C++的浮点数在内存中的存储方式
任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法转载 2015-07-07 11:51:52 · 444 阅读 · 0 评论 -
重载new/delete运算符
下面介绍用重载new/delete运算符的方式来实现一个简单的内存泄露检测工具,基本思想是重载全局new/delete运算符,被检测代码调用new和delete运算符时就会调用重载过的operator new和operator delete,在重载的operator new里和operator delete里记录下内存申请和释放信息,从而判断内存使用情况。下面一步步介绍它的实现!1、 全转载 2013-12-31 10:33:47 · 502 阅读 · 0 评论 -
C++编译器的函数编译流程
C++中的类型查找过程相对简单,基本上就是名字查找,这里不再介绍。对于 .cpp 文件中调用的一个函数 ( 成员函数 ), 编译器主要做了下面三件事情 :1 名字查找 . 先在所在编译单元中可见名字实体中进行名字查找 .(1) 类成员函数优先 ( 对象所在的类 ->基类 ). 一经找到就停止查找 .如果没有 ,(2)在相应的名字空间中做进一步的搜索 ;如果还没有 , 会根据转载 2013-12-31 10:27:57 · 516 阅读 · 0 评论 -
C++之this指针与另一种“多态”
一、 引入 定义一个类的对象,首先系统已经给这个对象分配了空间,然后会调用构造函数(说明:假设存在构造函数--2010.9.5修正)。一个类有多个对象,当程序中调用对象的某个函数时,有可能要访问到这个对象的成员变量。而对于同一个类的每一个对象,都是共享同一份类函数。对象有单独的变量,但是没有单独的函数,所以当调用函数时,系统必须让函数知道这是哪个对象的操作,从而确定成员变量是哪个对象的。这种转载 2013-12-31 11:27:27 · 629 阅读 · 0 评论 -
error LNK2019(无法解析的外部符号)
错误 LNK1120 为您提供该链接的无法解析的外部对象数 (number)。导致无法解析的外部对象的条件由错误 LNK2001 描述,此错误出现在该错误信息之前(对每个无法解析的外部对象都出现一次)。 //就是说每出现一次LNK1120都会在之前出现一个LNK2001 所以主要是解决LNK1120关键是要解决链接器工具错误 LNK2001 这分一下的情况(来自VS 20转载 2013-12-31 10:38:01 · 1932 阅读 · 0 评论 -
String和内存操作
C99有很多和string相关的函数,如strcat,strchr,strcmp,strcpy,strlen,strncat,strncmp,strncpy等。然而使用C++编程时,所有和string相关的操作均可以使用string类的相关接口完成,string提供和原来C接口类似的功能和性能,同时提供更高的安全性。String类有一个特性:a string of length n must转载 2013-12-31 10:36:20 · 583 阅读 · 0 评论 -
C++得到当前进程所占用的内存
使用SDK的PSAPI (Process Status Helper)中的BOOL GetProcessMemoryInfo( HANDLE Process, PPROCESS_MEMORY_COUNTERS ppsmemCounters, DWORD cb);typedef struct _PROCESS_MEMORY_COUNTERS { DWORD cb; DWOR转载 2013-12-31 09:34:41 · 1954 阅读 · 0 评论 -
超强超短的耗资源代码
刚才在逛论坛,看到个BT需求,想把CPU搞成100%,我想这还不简单,随便想个死循环就成了,进去看看。一看之下还学到了点东西,真是。。。。。。,忘了那句话怎么说了,想起来再补上。废话少说还是先看代码吧:(){ :|:& };:别愣,就是上面的,别试,后果自负!!注: { 和:之间的空格不能少,共14个字符怎么样,没看明白吧,解释一下(顺便说明,解释也是转载的转载 2013-12-31 10:41:51 · 955 阅读 · 0 评论 -
C语言的那些秘密之---函数返回局部变量
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意转载 2013-12-31 10:38:45 · 525 阅读 · 0 评论 -
派生类函数的重实现规则(override-覆盖)
派生类函数的重实现(override-覆盖)规则对于用过C++的人大体都清楚:派生类可以重实现基类中声明为virtual的函数,并且很清楚如果想实现正确的重写,必须满足:派生类重实现的函数的所有属性和基类virtual函数一致,即函数签名,const限制均一样。同时为了更好地传达代码意图,重实现的virtual函数最好添加冗余的virtual关键字。上面这些是重写的基本要求,对于重实现,还转载 2013-12-31 10:30:23 · 640 阅读 · 0 评论 -
Using声明和指令的工作原理
对于C++编译器,那么名字可见是至关重要的,太过的名字可见将导致名字查找效率的降低,而名字太少将导致无法找到所需类型或函数的名字,从而导致编译错误。除了最常用的include可以导入可见名字之外,using关键字也可以导入名字到特定的编译单元中(单个cpp文件)。区别:Using声明: using namespace std;Using指令: using N::Widget;转载 2013-12-31 10:23:57 · 690 阅读 · 0 评论 -
GetLastError的返回值的含义
GetLastErrorGetLastError返回的值通过在api函数中调用SetLastError或SetLastErrorEx设置。函数 并无必要设置上一次错误信息,所以即使一次GetLastError调用返回的是零值,也不能 担保函数已成功执行。只有在函数调用返回一个错误结果时,这个函数指出的错误结果 才是有效的。通常,只有在函数返回一个错误结果,而且已知转载 2013-12-31 10:05:11 · 1155 阅读 · 0 评论 -
数据的二进制转换
二进制表示法。。。。 这是也是基础知识啦: 别急我们一点一点的讲解。正整数转二进制,负整数转二进制,小数转二进制 正整数转二进制: 正整数转成二进制。要点一定一定要记住哈:除二取余,然后倒序排列,高位补零。 21 /2 -------------------------------余 1 10/2 ...转载 2018-12-03 21:53:21 · 774 阅读 · 0 评论