這個月工作比較緊張,沒有系統學習什麼新知識。平時會碰到一些半生不熟的東西,因為趕時間,上網查查,問問人,也能將就著用著。但是心裡總會有些不踏實,總想著能多明白一層也是好的。
1.lua與c互動時的堆疊
每個lua_state都只有乙個堆疊。當lua呼叫乙個c函式時,會保證這個函式可以使用lua_minstack個(預設是20)堆疊空間,不夠的話會自動擴充堆疊。預設情況下,為了效率,lua是不對堆疊操作(例如push)進行越界檢查的。但有時開啟這種檢查功能有助於發現一些隱蔽bug。luaconf.h裡有乙個巨集可以開啟這個檢查。
使用正負索引對堆疊進行訪問時,堆疊的可見範圍會被限定在當前函式棧裡,即當前函式的棧底base,與堆疊棧頂top之間。這也是我們在註冊的lua c函式裡,可以用1來索引當前函式呼叫第乙個引數的原因。
注意保持堆疊平衡,錯誤資訊處理完後也要彈出堆疊。
另外lua的物件導向冒號語法,會隱式傳遞物件本身。在c中實現這種函式時,要注意索引1處的位置是物件本身。
2.c++ static變數的繼承、覆蓋
其實與普通變數一樣,如果在子類裡重新定義(覆蓋),即重新分配了空間,在子類語境內的讀寫操作都是針對這個新定義的變數。否則操作的是父類變數。
3.object c特性
a.宣告定義和呼叫時,可以指明引數名稱
[myrectangle setoriginx: 30.0 y: 50.0];
也可以不指明
[myrectangle setorigin:30.0 :50.0];
對閱讀呼叫函式的**有幫助。
但是這種具名引數,並不支援可選引數、引數順序可變等特性。指定引數名稱的話,第乙個引數的名稱要和函式名稱拼在一起,這點讓我感到有些層次混亂。
b.訊息機制
[myrectangle setoriginx: 30.0 y: 50.0];
這種函式呼叫,在object c裡被稱作向myrectangle物件傳送了setoriginx訊息。訊息是物件導向設計方法裡的正式稱呼,概念也比較抽象。物件對訊息的反應,具體是呼叫乙個成員函式(c++),還是由執行時處理(object c),則視語言而定。執行時(runtime)在object c裡是個很重要的概念,雖然c++裡也有執行時型別識別(rtti),但是地位和功能與object c的執行時相比,可能要差上不少。obect c裡,每乙個訊息的傳送,都要經過執行時系統。在編譯階段,我們甚至可以傳送乙個原始碼裡並不存在對應函式方法的訊息給物件。我們也可以在執行時動態建立乙個原始碼裡並不存在型別、變數、方法等。這種執行時機制在物件導向的語義下提供了更大的靈活性,當然也付出了一些效能上的代價。
c.其他比如介面、分部類等語言特性,與c#都比較接近。
4.object c與c++混編
在我目前的專案裡,少部分會使用object c**,而最常打交道的仍然是c++**。object c**以.m為副檔名,c++**以.cpp為副檔名。兩者似乎都是使用llvm編譯器。如果object-c**裡想要包含c++**(或者說是object-c++**?),可以把副檔名由.m改為.mm。同時object c語言支援c語言語法。cpp檔案裡不可包含object c**。似乎xcode是根據副檔名來選擇不同的編譯前端來進行編譯工作的。
這篇文章的作者介紹了一種比較簡便的混編方案。要點是隱藏實現。
5.utf8
unicode規定了字元編碼,但沒有規定字元編碼的儲存格式。
utf8、utf16都是具體的儲存格式,utf16恰好與unicode編碼的直接儲存格式基本相同。
utf8沒有endian的問題。並不能在編譯器裡宣告乙個utf8字元,只能宣告乙個char陣列。機器並不能單獨處理乙個utf8字元,所有的處理都需要上層控制,也就不存在位元組序的問題。utf8標準規定了多位元組時的順序,在大端、小端機器上,都要這麼處理。
工作學習筆記 4月 5月
遊戲資源越來越大,開發時打包的速度越來越慢,雖然我已經採用makefile的方式,節省了未改變資源的重新編譯時間,但是還有兩個問題 1 make檢查所有資源是否過期這個操作很慢 2 打包操作本身總是把編譯後的資源全部打在一起,這一步不大幅修改打包程式本身 使之支援增量打包 很難有效提高速度。目前看來...
9月閱讀筆記
程式設計師修煉之道 從小工到專家 第一章 注重實效的哲學 注重實效的程式設計師的特徵 是他們處理問題 尋求解決方案時的態度 風格 哲學。設法把問題放在更大的語境中,設法注意更大的圖景對所做的每件事情負責,接受變化,擁抱變化,理解工作的語境。廣泛的知識和經驗基礎交流 我的原始碼讓貓給吃了 在所有弱點中...
工作中的學習(9月21日)
之前說的那個intent傳遞業務物件的事。實現parcelable比較費勁 但是可以通過serializable,序列化來搞定。測試1傳遞物件test1.intent將物件put進去,正常傳遞,獲取,新的activity,getintent之後,強轉成test1就可以了。測試2test1中多了乙個成...