手工实现字节对齐 及 代码质量思考
?在游戲編程中,我們經(jīng)常聽到序列化這個詞匯。在一些網(wǎng)絡(luò)通訊和數(shù)據(jù)處理時(shí),我們便會用到序列化。這里先不具體說明序列化。這里只說序列化過程中可能用到的字節(jié)對齊的問題:
?
我們首先是定義了這樣一個宏:
?
#define ALIGN( __size, __bits ) ?( ( ( ( __size - 1 ) >> __bits ) + 1 ) << __bits )
?
我們在使用的時(shí)候:
?DWORD dwSize = ALIGN( dataSize, 2 );
?
這樣傳入一個2,表示4字節(jié)對齊. ?假如我的dataSize = 10; ?通過這個宏我們可以算出dwSize = 12;
這種方法相對來說用得比較巧妙,當(dāng)然可能還有其他更好的方法, 我們這里不追究. 這里主要想說說我自己的一些感悟而已.
?
最初的想法我可能會把這個宏給寫成這樣:
#define ALIGN( __size, __bits ) ( ( __size % __bits == 0 ) ? __size : ( ( ( __size / __bits ) + 1 ) * __bits ) )
?
這樣雖然實(shí)現(xiàn)了功能, 但是總體來說還是麻煩了.. 不說追求完美. 至少應(yīng)該在準(zhǔn)備著手寫的時(shí)候多想一下還有沒有其他更簡單高效的辦法.
?
之前也碰到過一些東西, 比如你在一個函數(shù)中調(diào)用另外一個函數(shù). 另外一個函數(shù)是事先別人已經(jīng)寫好的. 你恰好又要在被調(diào)函數(shù)里獲取你主調(diào)函數(shù)里面計(jì)算出來的一個值. 這時(shí)你可能第一個想法就是給函數(shù)加一個參數(shù). 為了跟其他地方兼容就加一個默參. 這樣當(dāng)然是好的..但是有的時(shí)候你可能并不這么想. 你可能會去把這個計(jì)算的值給添加成被調(diào)函數(shù)的所在類的成員里面去. 這樣一個臨時(shí)用來做判斷的值, 你就無形之間增加了類的負(fù)擔(dān). 特別是在服務(wù)器的嚴(yán)謹(jǐn)邏輯下, 都這樣寫的話將造成很多浪費(fèi)..
?
再舉一個例子吧, 假如我們有一個玩家組隊(duì)的隊(duì)伍數(shù)組. 里面都是玩家對象. 我們一個玩家退出了隊(duì)伍. 我們就得刪除這個玩家在數(shù)組中的數(shù)據(jù). 這時(shí)我們會怎么做呢?
我們是不是要遍歷到玩家的索引,然后刪除,然后把后面的玩家依次往前移動一個單位呢? 對,想法是對的,落實(shí)的話我們可以考慮一下了. 到底要循環(huán)多少次? 需不需要循環(huán)?
我們便可以找到答案:
先遍歷找到玩家的索引,比如用index表示, 玩家數(shù)組用playerArray, 之后我們就可以這樣:
if ( index < MAX_TEAM_PLAYER - 1 )
{
? ? memcpy( playerArray[ index ], playerArray[ index + 1 ], sizeof(?playerArray[ index + 1 ] ) * (?MAX_TEAM_PLAYER - index - 1 )? ) ;
}
memset( playerArray[ MAX_TEAM_PLAYER - 1 ], 0, sizeof( playerArray[ MAX_TEAM_PLAYER - 1 ] ); ? // 這句不能忘喲 - -
?
這樣是不是就簡單些了? 當(dāng)然這里只是舉的簡單的例子..更多的還是需要我們?nèi)ンw會..這里只是提出思考..有什么地方說的不對望指教..
轉(zhuǎn)載于:https://blog.51cto.com/masefee/814060
總結(jié)
以上是生活随笔為你收集整理的手工实现字节对齐 及 代码质量思考的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于default constructo
- 下一篇: 字符在utf-8,gbk,gb2312,