摘要: 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。
現在慘了,上優酷網看視頻變得很不流暢了,帶寬不夠。
好多東西要收拾,光是書就有三大袋,殘念……,算是一個典型的書呆子了,書倒是一堆,看完的沒幾本。
還有衣服,棉被,電腦桌椅,臺式機,以及其他雜七雜八的。。。
每次搬家總是很不情愿,似乎在一個地方住久了就會產生感情,另一個重要的原因就是東西比較多,收拾搬動都很麻煩。
而每次搬家內心總是有很多感慨,總有一股淡淡的憂愁和失落,于是我的電腦里就不停地播放亞亞的歌聲,只有亞亞的歌聲能讓我的心情平復。
天知道沒有你,遠方會變成怎么樣。 ------- 《秋天的眼淚》