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