摘要: C++ARM中解释说type-safe linkage并不能100%的保证类型安全。既然它不那100%的保证类型安全,那么它就肯定是不安全的。统计分析显示:即便在很苛刻的情况下,C++ 出现单独的O-ring错误的可能性也只有0.3%。但我们一旦将6种这样的可能导致出错的情况联合起来放在一起,出错的几率就变得大为可观了。在软件中,我们经常能够看到一些错误的起因就是其怪异的联合。OO的一个主要目的就是要减少这种奇怪的联合出现。
阅读全文
摘要: 【P&S 94】中提到对于类型安全的检测来说有两种假设。一种是封闭式环境下的假设,此时程序中的各个部分在编译期间就能被确定,然后我们可以对于整个程序来进行类型检测。另一种是开放式环境下的假设,此时对于类型的检测是在单独的模块中进行的。对于实际开发和建立原型来说,第二种假设显得十分有效。然而,【P&S 94】中又提到,“当一种已经完成的软件产品到达了成熟期时,采用封闭式环境下的假设就可以被考虑了,因为这样可以使得一些比较高级的编译技术得以有了用武之处。只有在整个程序都被了解的情况下,我们才可能在其上面执行诸如全局寄存器分配、程序流程分析及无效代码检测等动作。”(附:【P&S 94】Jens Palsberg and Michael I. Schwartzbach, Object-Oriented Type Systems, Wiley 1994)。
阅读全文
摘要: 在所有对C++的批评中,虚拟函数这一部分是最复杂的。这主要是由于C++中复杂的机制所引起的。虽然本篇文章认为多态(polymorphism)是实现面向对象编程(OOP)的关键特性,但还是请你不要对此观点(即虚拟函数机制是C++中的一大败笔)感到有什么不安,继续看下去,如果你仅仅想知道一个大概的话,那么你也可以跳过此节。【译者注:建议大家还是看看这节会比较好】
在C++中,当子类改写/重定义(override/redefine)了在父类中定义了的函数时,关键字virtual使得该函数具有了多态性,但是 virtual关键字也并不是必不可少的(只要在父类中被定义一次就行了)。编译器通过产生动态分配(dynamic dispatch)的方式来实现真正的多态函数调用。
阅读全文
摘要: 算起来,我用Visual C++也有将近5年的历史了。在这期间,我也曾涉猎过Visual Basic和Delphi,但都是浅尝而止;Visual C++始终是我的主业。可是努力的成果如何呢?我用Delphi作出了十多个有规模的软件,用VB--虽然我用在VB上的时间只有短短的两三个月--也有两个像样的项目;然而,在我付出了最大热情和最多努力的Visual C++上面,却只作出了三个自己看得上眼的软件。
阅读全文
摘要: 声音内核为快速和容易地将声音和音乐加入到游戏中提供了一种解决方案,声音内核包含6个类组件。
阅读全文
摘要: 音乐就是一系列的音符,这些音符在不同的时间用不同的幅度被播放或者停止。有非常多的指令被用来播放音乐,但是这些指令的操作基本相同,都在使用各种各样不同的音符。在计算机上进行作曲,实际上是存储了很多组音乐,回放时由音频硬件将这些音符播放出来。
阅读全文
今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,MSDN文档的说明如下:
Retrieves the offset of a member
from the beginning of its parent structure.
size_t offsetof(
structName,
memberName
);
Parameters
structName
Name of the parent data structure.
memberName
Name of the member in the parent data structure for which to determine the
offset.
Return Value
offsetof returns the offset in bytes of the specified member from the beginning
of its parent data structure. It is undefined for bit fields.
Remarks
The offsetof macro returns the offset in bytes of memberName from the beginning
of the structure specified by structName. You can specify types with the struct
keyword.
Note
offsetof is not a function and cannot be described using a C prototype.
跟踪代码发现定义如下:
#define offsetof(s,m) (size_t)&(((s *)0)->m)
然后到网上查了一下,发现还真的是很有用,附带一位大侠的解说:
struct AAA
{
int i;
int j;
};
struct AAA *pAAA;
pAAA=new AAA;
这时,pAAA实际上是一个Pointer, 指向某一确定的内存地址,比如0x1234;
而 pAAA->i 整体是一个int型变量,其地址是&(pAAA->i) ,'&'为取址运算符;
那么&(pAAA->i)一定等于0x1234,因为i是结构体AAA的第一个元素。
而&(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因为sizeof(int) = 4;
这个做法的巧妙之处就是:它把“0”作为上例中的pAAA,那么 &(pAAA->j)就是j的offset啦。
解析结果是:
(s *)0 ,将 0 强制转换为Pointer to "s"
可以记 pS = (s *)0 ,pS是指向s的指针,它的值是0;
那么pS->m就是m这个元素了,而&(pS->m)就是m的地址,而在本例中就是offset啦
再把结果强制转换为size_t型的就OK 了,size_t其实也就是int啦!!
也就是说:
0 ---> (s *)0
原来的0是数值类型,现在是结构体指针类型,尽管类型变了,但其值还是不变,也就是说还是0,但这个值的意义变了,现在是地址,而不是数值。
&(((s *)0)->m)求出字段m的地址值,但由于首地址是0,所以&(((s *)0)->m)求出字段m相对于首地址的偏移值。
摘要: 通过键盘、鼠标和游戏杆,输入内核提供了一种手段,使玩家能够同游戏进行交互。使用两个简单的类:INPUT和INPUT_DEVICE产生输入设备。 INPUT类用来初始化DirectInput,而INPUT_DEVICE类用来包含一个DirectInput设备接口对象。如果要使用多个设备,需要对每个设备使用单独的INPUT_DEVICE对象。
阅读全文
搬了家,这个小区比较安静,晚上睡觉没有那么吵了,不过没有电信宽带,只能通过ADSL上网。
平时浏览网页什么的速度还可以,但速度还是比不上小区宽带,主要就是下载太慢了,用迅雷下载最快也就200多k,如果用电信的局域网小区宽带下载,最快每秒可以接近2M。
现在惨了,上优酷网看视频变得很不流畅了,带宽不够。
好多东西要收拾,光是书就有三大袋,残念……,算是一个典型的书呆子了,书倒是一堆,看完的没几本。
还有衣服,棉被,电脑桌椅,台式机,以及其他杂七杂八的。。。
每次搬家总是很不情愿,似乎在一个地方住久了就会产生感情,另一个重要的原因就是东西比较多,收拾搬动都很麻烦。
而每次搬家内心总是有很多感慨,总有一股淡淡的忧愁和失落,于是我的电脑里就不停地播放亚亚的歌声,只有亚亚的歌声能让我的心情平复。
天知道没有你,远方会变成怎么样。 ------- 《秋天的眼泪》