自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(84)
  • 资源 (4)
  • 收藏
  • 关注

原创 const char** 与 char** 相容问题

foo(const char** p){}main(int argc,char** argv){ foo(argv); }以上代码在编译时会发出一条警告信息 warning :argument is incompatible with prototype为什么会发出这样的警告呢 要回答这个问题,其实还是挺麻烦的,但咱绝不是复制粘贴首先形参作为左值,实参作为右值若...

2018-09-06 00:45:33 2613

原创 变量,作用域和内存问题

1 JS的数据类型分为基本数据类型和引用数据类型 基本数据类型分为Undefined Null String Number Bool 关于引用数据类型 var a = new Object(); a.name = “lili”; alert(a.name);//lili但是基本数据类型是不能添加任何属性的 var a = “hello,world”; a.name = “lil...

2018-07-04 11:05:01 234

原创 JS Number() parseInt() parseFloat() 区别和 联系

Number() parseInt() parseFloat() 都会忽略前面的空格和0,但是在忽略完前面所有的空格后,如果找不到有效的数字字符 或者 Number():正负号 小数点 parseInt():正负号 parseFloat():正负号,小数点Number() boolean只会被转化成0和1 数字值不会改变 undefine 转化成NaN null转化成0 如果是...

2018-06-27 11:43:44 899

原创 effective c++条款14

1.复制RAII对象必须一并复制它所管理的资源,所以资源的copying行为决定RAII对象的copying行为 2.普遍而常见的的RAII class copying行为是:抑制copying,施行引用计数法第1条的意思是:我们要根据资源的copying行为去选择所用的管理类, 比如, 我之前有个类class Lock{public: explicit Lock(mutex* p

2018-04-15 10:31:21 340

原创 effective c++条款13

所谓资源就是,一旦用了它,将来必须还给系统 c++最常使用的资源就是动态分配内存,但内存只是你必须管理的众多资源之一,其他常见的资源还包括文件描述器,互锁器,图形界面中的画笔,画刷,字型,数据库连接,网络socket等等RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的

2018-04-14 20:51:55 191

原创 effective c++条款12

1.Copying函数应该确保复制“对象内的所有成员变量”及所有”base class”成分 2.不要尝试以一个copying函数去实现另一个copying函数,应该将共同机能放进第三个函数中,由两个copying函数调用如果类中没有定义复制构造函数和赋值构造函数,编译器会为我们提供默认的赋值和复制构造函数,但是如果你自己定义了这些函数, 但是数据没有全部copy,编译器是不会提醒你的看下面的

2018-04-13 17:11:51 423

原创 effective c++条款11

在 operator= 中处理自我赋值自我赋值发生在对象被赋值给自己时,比如w=w,但是更多的是隐性的自我赋值(不能一下子看穿的) 如果i=j,那么a[i]=a[j]算不算自我赋值呢 假设有这么一段代码class Bitmap {...}class Widget{public: ...private: Bitmap* pb;}//下面是operator=的代码Widg

2018-04-13 15:06:35 363

原创 effective c++条款10

令赋值操作符返回一个reference to *this如果赋值操作符不返回引用,那么它只能返回一个临时对象,用一个变量接收这个对象时还需要调用复制构造函数代码:#include <windows.h>#include <iostream>#include <string>#include <vector>using namespace std;class E04{ friend

2018-04-13 13:05:38 209

原创 effective c++条款09

在构造和析构函数期间,不要调用virtual函数(或者说调用了也不能显示出多态的行为),因为这类调用从不下降至derived class(派生类) 看如下代码:#include <windows.h>#include <iostream>using namespace std;class Base { public: Base() { OP

2018-04-13 12:11:06 257

原创 effective c++条款07

1.带多态性质的基类应该声明一个virtual析构函数,一个基类只要带有任何虚函数,都应该声明一个virtual析构函数 2.所有抽象类的析构函数都应该带有一份实现,否则链接器会报错(因为派生类的析构最终会调用到基类的析构函数,如果基类的析构函数没有提供实现,此时链接器找不到其实现,就会抱怨) 3.如果一个类不是被用作基类或者不是用于多态,则不应该声明virtual析构函数,因为声明之后,类的组

2018-04-11 22:20:44 191

原创 effective c++条款06

为驳回编译器自动提供复制构造函数和赋值构造函数的机能,可将相应的成员函数声明为private,但不予实现,或者使用像Uncopyable这样的base class也是一种做法为防止对象被复制或者赋值,只需声明赋值构造函数或者赋值构造函数而不提供实现,且把他们的保护属性设为private#include <Windows.h>#include <iostream>#include <string>

2018-04-11 00:11:56 143

原创 effective c++条款05

编译器可以暗自为class创建default构造函数,copy构造函数,copy assignment函数看个例子#include <Windows.h>#include <iostream>#include <string>using namespace std;class E05{ friend ostream& operator<<(ostream& out, E05& e05

2018-04-10 23:23:44 145

原创 effective c++条款04_2

全局变量尽量少使 比如 我在一个文件中定义a=10,在另一个模块中定义b=a 此时你一定认为b=10 但是这里很可能不是10,因为不同模块的全局变量初始化是不确定的 有可能b先被初始化,那么b就是一个不确定的值了 所以,为了解决这个问题 我们需要在函数中使用局部静态变量 int get_a() { static int a = 1...

2018-04-10 16:35:31 150

原创 effective c++条款04-1

1.为内置类型进行手工初始化,C++不保证会初始化他们,这取决于你用的是C++的哪部分(STL自动初始化,C不会自动初始化) 2.构造函数最好使用成员初始化列表,而最好不要在构造函数本体内进行赋值操作,初始化列表列出的成员变量,其顺序最好和class声明时一样 3.为免除”跨编译单元之初始化次序”问题,请以local static 对象替代 non-local static变量第1条好理解,所有

2018-04-10 15:20:24 132

原创 effective c++条款03

const这个关键字非常的神奇,我们首先来剖析它的作用 它的作用范围类外可以修饰global或者namespac作用域中的常量,也可以修饰文件,函数,或者区块作用域中被声明为static的变量 或者修饰指针,或者修饰函数 在class内可以修饰内部的static或者non-static变量,成员函数的参数,成员函数本身,以及成员函数返回值得修饰在class外 修饰常量问题不大,比如con...

2018-04-10 00:55:34 161

原创 effective c++条款02

尽量以const,enum,inline 替代define 这条可以改为”宁可以编译器替换预处理器”比较好 首先#define 很方便,但是,它也存在很多问题 1.比如 #define ASPECT_RATIO 1.653 记号名称ASPECT_RATIO从未被编译器看见,因为它被预处理器替换掉了之后,才轮到编译器运行 如果出现问题,你只会在error里隐约看到1.653,如果 ASPEC

2018-04-09 23:58:14 311 1

原创 effective c++条款01

C++主要由以下4个次语言构成 1.C语言:C++主要发展于C,这个就不用说了吧。区块,语句,预处理器,内置数据类型,数组,指针 2.面向对象的C++包含类的封装,继承,多态 3.Template C++即泛型编程 4.STL 其实就是一个泛型编程的库C++高效编程守则原则的变动取决于你使用它的哪个部分本来不想写这些的,但是如果对C++本身都不了解,怎么能更好的使用它呢

2018-04-09 12:03:23 134

原创 cocos2d类的层级关系

Director:导演,单例类Director::getInstance() 设置游戏配置(OpenGL),推动游戏发展 runWithScene,replaceScene,pushScene,popSceneScene:场景 负责组织游戏元素 Layer:层,负责组织游戏元素 Sprite:精灵,封装了一张图片,显示具体元素,背景图片,主角,敌人,道具,头像 GLView:舞台...

2018-04-07 12:48:45 1617

转载 cocos2d环境搭建

(一)环境搭建 RichardMillings2014-08-06 14:10:002838 次阅读 最近3.2版本更新出來了!这是自2.x分支以来修复了超过450个bug,3.2版本是目前为止,官方发布的最稳定的版本。本文介绍如何搭建Cocos2d-x 3.2版本的开发环境。 ...

2018-04-07 11:44:22 198

原创 关于RegQueryValueEx

今天发现RegQueryValueEx在使用时,DEBUG下可以正确的读取注册表的值,Release下不能正确读取注册表的值 后来发现是该函数的最后一个参数是一个输入输出参数,该参数一定要进行初始化,否则会无法读出注册表的值,而且这个值一定要大于等于应该实际被装载到缓冲区的字节数...

2018-04-07 10:53:53 705

原创 静态tls的使用

前面我们说过动态tls的使用方法,现在我们说下静态tls的使用方法 静态tls的使用方法就简单多了,只需在定义全局变量的时候多加一句_declspec(thread) 这样就能为每个线程建立一个与线程相关联的变量下面是使用示例 main.cpp#include &lt;Windows.h&gt;#include &lt;stdio.h&gt;DWORD WINAPI Work...

2018-02-21 21:17:53 772

原创 动态tls的使用

多线程的时候最好不要使用全局和静态变量,因为如果一个线程改变了全局变量的值,另一个线程在不知情的情况下有可能引用这个变量导致不可预料的错误 我们先举个例子 假设两个线程各自从0-9999计数 如果我们这样写 main.cpp#include &lt;Windows.h&gt;#include &lt;stdio.h&gt;DWORD WINAPI WorkThread(LPVO...

2018-02-21 17:59:56 671

原创 c++编写供其他工具使用的dll

以前我曾经说过dll的编写,但是以前编写的dll无法供其他工具使用以前我们是这样写的 DllGenerator.h#ifndef _DLLGENERATOR_H#define _DLLGENERATOR_H#ifdef DLLPROJ#define AMB extern "C" _declspec(dllexport)#else#define AMB extern "C" _...

2018-02-20 23:00:26 152

原创 c/c++运行期库的使用

本次介绍关于c/c++运行库的一些重要的内容 很多人在使用malloc,free函数时,会经常出现内存错误 比如下面的源码void ExeFunc(){ PVOID pv=DLLFunc(); free(pv);}PVOID DLLFunc()//这个函数的源代码在DLL中{ return malloc(100);}那么这个代码能够正常运行吗?答案是不确定 1.

2018-02-12 14:21:24 320

原创 DLL延迟加载和即时卸载

今天我们来讲讲DLL的高级应用:DLL的延迟加载 若要延迟加载,必须要多加两个链接程序开关 /Lib:DelayImp.lib /DelayLoad:MyDll.dll 第一个开关告诉链接程序将一个特殊的函数delayLoadHelper嵌入你的可执行模块 第二个开关有以下几个功能: 1.从可执行文件的输入节中删除MyDll.dll,这样,程序在初始化时就不会显示加载dll 2.建立一

2018-01-31 23:31:55 1598

原创 printf sprintf %s %S

printf 的%s,用来打印ANSI字符串 printf的%S,用来打印UNICODE字符串#include <Windows.h>#include <stdio.h>#include <tchar.h>#include <iostream>using namespace std;int main(){ printf("my name is %S",L"XYZ"); r

2018-01-30 22:10:37 1839

原创 关于堆栈(2)

创建辅助堆栈: HANDLE HeapCreate( DWORD flOptions, // heap allocation attributes SIZE_T dwInitialSize, // initial heap size SIZE_T dwMaximumSize // maximum heap size ); flOptions:0,HEAP_G

2018-01-11 00:14:42 132

原创 关于堆栈(1)

我们总结一下前面讲过的: 虚拟内存: 1.虚拟内存可以用于处理大批量数据 内存映射文件: 1.内存映射文件加载exe和DLL可以节省时间和页文件 2.使用内存映射文件来访问磁盘上的文件,可以避免I/O读写,也不需要为文件内容进行缓存 3.内存映射文件可以用于进程间的共享 4.对于某些数据量不确定的应用,可以使用稀疏文件今天主要说的是堆栈: 堆栈的作用是可以用来进行分配较小的数据

2018-01-09 16:44:40 139

原创 稀疏提交的内存映射文件

前面提到CreateFileMapping创建映射文件 第三个参数主要有三个值PAGE_READONLY,PAGE_READWRITE,PAGE_WRITECOPY 这三个值得意思我就不在做描述了 其实还有SEC_COMMIT,SEC_IMAGE,SEC_NOCACHE,SEC_RESERVE 我想大家应该知道MEM_COMMIT和MEM_RESERVE标志的意思(VirtualAlloc函数

2018-01-08 23:13:01 481

原创 windows98 和 windows2000(或者windows2000之后的版本)的内存映射的区别

先看张图片 在这张图中可以看出windows98可以映射内存映射文件的地址范围为0x80000000-0xBFFFFFFF,而且这段地址范围还是所有进程共享的 windows2000的可以映射内存映射文件的地址范围是0x00010000-0x7FFFFFFF(32位,64位同理)综合以上两点,可以得出 1.因为windows98的内存映射区域是共享的,所以,每次使用MapViewOf

2018-01-07 23:24:30 738

原创 MapViewOfFileEx

一个文件的多个视图具有相关性,即一个视图的数据发生了变化,其他视图的相关数据也会发生变化MapViewOfFileEx这个函数其实就比MapViewOfFile多了个基地址参数,这个值一定要是分配粒度的倍数下面说说这个函数有什么用 MapViewOfFile把内存映射文件映射到进程的地址空间不确定,如果,我们创建了一个内存映射文件,然后映射到进程空间,我们在内存映射文件中做个链表(即链表

2018-01-07 22:27:21 2406

原创 使用内存映射文件处理大文件示例

前面我们讲过内存映射文件的使用,但是,如果文件大小超过内存大小那怎么办呢 其实,我们在把内存映射文件映射到进程的地址空间时,可以映射一部分,通过一个循环,把整个文件处理完下面我举个例子#include #include #include using namespace std;__int64 Count0s();int main(){ __int64 co=Cou

2018-01-05 15:40:38 1768

原创 内存映射文件使用范例

使用内存映射文件必须执行下列操作步骤 1.创建或打开一个文件内核对象,该对象用于标识你想用作内存映射文件的文件 2.创建一个文件映射内核对象,告诉系统该文件的大小和你打算该如何访问该文件 3.让系统将文件映射对象的一部分或全部映射到你进程的地址空间 4.当完成对内存映射文件的使用时,需要撤销映射到你的进程的地址空间中的文件 5.关闭文件映射内核对象 6,.关闭文件内核对象下面介绍一

2018-01-04 23:48:45 395

转载 内存映射文件原理探索

一直都对内存映射文件这个概念很模糊,不知道它和虚拟内存有什么区别,而且映射这个词也很让人迷茫,今天终于搞清楚了。。。下面,我先解释一下我对映射这个词的理解,再区分一下几个容易混淆的概念,之后,什么是内存映射就很明朗了。 原理首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只硬盘上文件的位置与进程逻辑地址空间中一块大小相同的区域之间的一一对应,如

2018-01-01 17:42:31 123

原创 内存映射之共享静态数据的方法

介绍这种方法之前,我们先介绍下一些背景知识 每个exe或者dll文件都是由节组成,按照规定,每个标准节都是以圆点开头 举个例子:代码节为”.text” 所有未初始化的数据被编入”.bss”节 初始化的数据被编入”.rdata”节 每个节都有其属性 READ:该节的数据只读 WRITE:该节的数据可写 EXECUTE:该节的数据只能执行 SHARED:

2017-12-30 21:59:36 249

原创 c/c++堆栈检查函数详解

c/c++运行期库包含一个堆栈检查函数,当编译源代码的时候,编译器在恰当的时候(这个在下面讲)生成对该函数的调用 下面我们看个函数void SomeFunction(){ int nValues[4000]; nValues[0]=0;}该函数需要16000个字节的堆栈空间,编译器生成的用于分配该堆栈空间的代码只是将堆栈指针递减16000个字节,但是在程序试图访问该内存之前,系

2017-12-29 09:36:20 701

原创 线程的堆栈结构详解

每当创建一个线程的时候,系统会为现成的堆栈保留一个堆栈空间区域,并将一些物理存储器提交给这个区域,按照默认设置,系统保留1MB的地址空间,并提交两个页面,为什么初始是2个页面,接下来会有说明 win2000及以上的系统版本 首先,线程的堆栈去刚刚创建时是这样的 我们看到系统为堆栈分配的地址空间的范围为0x08001000-0x080FF000 当然这个地址是随机的,但是,一般大小是确定的

2017-12-28 22:57:29 9623

原创 在应用程序中使用虚拟内存(VirtualAlloc VirtualFree)

此虚拟内存非彼虚拟内存,此虚拟内存实际上指的是虚拟地址空间 LPVOID VirtualAlloc{ LPVOID lpAddress, // 要分配的内存区域的地址 DWORD dwSize, // 分配的大小 DWORD flAllocationType, // 分配的类型 DWORD flProtect // 该内存的初始保护属性 }; 1.这个函数可以用来对虚拟地址空间进行分配

2017-12-10 12:56:27 3604

原创 VirtualQueryEx详解

DWORD VirtualQueryEx( HANDLE hProcess, // 想要查询的地址空间所属的进程的句柄 LPCVOID lpAddress, // 区域地址 PMEMORY_BASIC_INFORMATION lpBuffer, // 结构缓冲区 SIZE_T dwLength

2017-11-30 21:45:38 12299

原创 GlobalMemoryStatus详解

VOID GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer // 内存状态的指针 ); 用法我就不讲了,现在我们讲讲MEMORYSTATUS结构里每个成员分别代表什么 typedef struct _MEMORYSTATUS { DWORD dwLength; DWORD dwMemoryLoad; SIZE_T dwTo

2017-11-29 23:21:43 3401

深度探索C++对象模型中文清晰版.rar

本书扫描版,但还是比较清晰的,对于想了解c++对象内部结构的同学来说,是本不 可多得的好书,如果觉得书不错,请给予正面评价,谢谢

2019-05-22

windows核心编程第7章 SchedLab

windows核心编程第7章,自编代码,无需用windows核心编程的库文件,如看这本书不懂的,可以下载下来看看,代码如有错误,请提出

2017-09-18

windows核心编程 JobLab.rar

windows核心编程附带的资源在win7上有些运行不畅(可能跟函数库有关系),我按照自己的理解重新写了一个,不需要原作者编撰的库

2017-09-13

金文老师的VB视频讲义.pdf

很多人看金文老师的VB视频教程却苦于没有讲义,我把这些放在这里

2015-01-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除