windows c++ 问题

LocalAlloc 和 GlobalAlloc

  16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。而LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存。

  由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。  而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存,但是每个全局内存空间需要额外的内存开销,造成分配浪费。而且一旦发生严重错误,可能会影响到整个系统的稳定。  

  不过在Win32中,每个进程都只拥有一个省缺的私有堆,它只能被当前进程访问。应用程序也不可能直接访问系统内存。所以在Win32中全局堆和局部堆都指向进程的省缺堆。用LocalAlloc/GlobalAlloc分配内存没有任何区别。甚至LocalAlloc分配的内存可以被GlobalFree释放掉。所以在Win32下编程,无需注意Local和Global的区别,一般的内存分配都等效于HeapAlloc(GetProcessHeap(),...).

VC中的RTTI扩展

  什么是RTTI?Run Time Type Information。

  编译选项在哪? Property -> C/C++ -> Language -> /GR,选项默认打开。

  dynamic_cast到底干了啥?动态运行时检察,即帮你在指针转换时检察,当前指针是否可以转换成另一个指针,如果不行,返回NULL。

  何时应该关闭/GR选项?当自己的类库中自实现了一套RTTI机制,则请关闭/GR,因为2套机制冗余。

__w64 检测64位可移植性问题

__w64是种标识,用来帮助Coder发现32位程序移植到64位程序的问题。上文说,有三种类型的数值,int、long、pointer,这三类数值在32位系统里是32bit,在64位系统里是64bit。将32位程序移植到64位程序跟上面这些东西有什么关联呢?看下面的例子。

有一个变量 i0 ,不论在32位系统下,还是64位系统下,都是32bit,另一个变量 i1,在32位系统下是32bit,在64位系统下是64bit。

那么,当在32位系统下写程序时,i0 = i1 不会有问题,都是32bit;但是在同样的代码移植到64位下时,实际发生的是64bit数值赋给32bit数值,有可能丢失精度。

为了提醒Coder注意这种错误,通过/Wp64 开关来打开__w64功能,就能在32位系统中引起警告。

__w64貌似已经被VC抛弃,亲测过,目前V9仍可用。最后,这个东西,不怎么有用……但是ATL中用到了。理解这个东西有助于理解ATL代码。The end.

#error

#error msg 指定错误,使编译不能过,debug wnd显示消息fetal error : msg。

此预处理一般和#ifndef一起使用,用来判定某个条件编译条件是否满足

使用样例如下:

  

原文地址:https://www.cnblogs.com/tekkaman/p/2024537.html