手工实现字节对齐 及 代码质量思考
在游戏编程中,我们经常听到序列化这个词汇。在一些网络通讯和数据处理时,我们便会用到序列化。这里先不具体说明序列化。这里只说序列化过程中可能用到的字节对齐的问题:
我们首先是定义了这样一个宏:
#define ALIGN( __size, __bits ) ( ( ( ( __size - 1 ) >> __bits ) + 1 ) << __bits )
我们在使用的时候:
DWORD dwSize = ALIGN( dataSize, 2 );
这样传入一个2,表示4字节对齐. 假如我的dataSize = 10; 通过这个宏我们可以算出dwSize = 12;
这种方法相对来说用得比较巧妙,当然可能还有其他更好的方法, 我们这里不追究. 这里主要想说说我自己的一些感悟而已.
最初的想法我可能会把这个宏给写成这样:
#define ALIGN( __size, __bits ) ( ( __size % __bits == 0 ) ? __size : ( ( ( __size / __bits ) + 1 ) * __bits ) )
这样虽然实现了功能, 但是总体来说还是麻烦了.. 不说追求完美. 至少应该在准备着手写的时候多想一下还有没有其他更简单高效的办法.
之前也碰到过一些东西, 比如你在一个函数中调用另外一个函数. 另外一个函数是事先别人已经写好的. 你恰好又要在被调函数里获取你主调函数里面计算出来的一个值. 这时你可能第一个想法就是给函数加一个参数. 为了跟其他地方兼容就加一个默参. 这样当然是好的..但是有的时候你可能并不这么想. 你可能会去把这个计算的值给添加成被调函数的所在类的成员里面去. 这样一个临时用来做判断的值, 你就无形之间增加了类的负担. 特别是在服务器的严谨逻辑下, 都这样写的话将造成很多浪费..
再举一个例子吧, 假如我们有一个玩家组队的队伍数组. 里面都是玩家对象. 我们一个玩家退出了队伍. 我们就得删除这个玩家在数组中的数据. 这时我们会怎么做呢?
我们是不是要遍历到玩家的索引,然后删除,然后把后面的玩家依次往前移动一个单位呢? 对,想法是对的,落实的话我们可以考虑一下了. 到底要循环多少次? 需不需要循环?
我们便可以找到答案:
先遍历找到玩家的索引,比如用index表示, 玩家数组用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 ] ); // 这句不能忘哟 - -
这样是不是就简单些了? 当然这里只是举的简单的例子..更多的还是需要我们去体会..这里只是提出思考..有什么地方说的不对望指教..
转载于:https://blog.51cto.com/masefee/814060
手工实现字节对齐 及 代码质量思考相关推荐
- C语言结构体的1字节对齐(代码实现)
#include <stdio.h>#define BYTE1 __attribute__((packed, aligned(1))) //aligned(1):1字节对齐typedef ...
- 面试题--特别是字节对齐
来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...
- keil+mdk+c语言,keil mdk+stm32的ac5和 ac6两个编译器下的字节对齐操作方法
最近在使用ac6.9的编译器,编译速度是真的很快,使用stm32的hal库编译速度也比ac5的编译器快很多. 本文试验stm32中字节对齐的代码测试,主要是结构体,因为结构体中实际项目中用到最多,同时 ...
- ACE CDR 字节对齐分析
ACE的数据都用CDR来表示,屏蔽平台字节序的差异性.(http://www.cnblogs.com/mlog/) 下面分析下它在字节对齐方面的代码: ACE_OutputCDR cdr; ACE_C ...
- 一周技术思考(第21期)-人们说脏话的频率是衡量代码质量的唯一标准
大家好,这里记录,我每周读到的技术书籍.专栏.文章以及遇到的工作上的技术经历的思考,不见得都对,但开始思考总是好的. Bob大叔在<代码整洁之道>这本书中,曾说过,"人们说脏话的 ...
- 更改结构体的内存字节对齐方式--经典
结构体字节对齐 http://blog.163.com/ecy_fu/blog/static/4445126200910603739941/ http://hi.baidu.com/skyland_l ...
- 提高面试代码质量的三要素
作者总结自己多年面试他人以及被他人面试的经验,发现应聘者可以从代码的规范性.完整性和鲁棒性三个方面提高代码的质量. 程序员在职业生涯中难免要接受编程面试.有些程序员由于平时没有养成良好的编程习惯,在面 ...
- 字节对齐和C/C++函数调用方式学习总结(多篇节选)
字节对齐和C/C++函数调用方式学习总结 created: 04-06-17 last saved: author: ayixidelu 前言: <***软件编程规范>中提到:" ...
- 代码质量随想录(五)注得多不如注得巧
写代码也流行注水了么?不是不是,我说的是注释.其实注释这个东西,历史久远.我们可以宽泛一点儿说,<春秋>就是要配上左传的注解,才能兴发其"微言大义"嘛!注释有很多种,如 ...
最新文章
- sklearn使用FeatureHasher处理字符串特征: AttributeError: ‘str‘ object has no attribute ‘items‘
- 互联网刚刚年满50,发明它的那个人却「后悔」了
- 【Android 应用开发】Android - 按钮组件详解
- [转] [翻译]C# Object Initialization[完整版]
- 持续集成之jenkins基础
- docker-compose执行报错(selinux所致):write /proc/self/attr/keycreate: permission denied
- 软考网络工程师笔记-综合知识1
- 好看的极简网站导航源码自适应静态页
- alloc_page分配内存空间--Linux内存管理(十七)
- Java 实验5 T4 检验字符串是否合法
- HTML中select的option设置selected=“selected“无效的解决方案
- 详解多维数组与指针之间的关系
- BZOJ 1096: [ZJOI2007]仓库建设 | 斜率优化DP
- (转)MongoDB入门分享-笔记整理精选
- 如何配置线上生产服务器环境(密匙登录、防火墙 、Node、Nginx、MongoDB、Redis、Mysql、PHP、JDK、Tomcat等)
- 使用Pilon对基因组进行polish
- linux 嗅探器源码,一个简易网络嗅探器的实现
- CSS画心形的三种方法,超级简单
- 七大数字经济重点产业!
- 有序列表和无序列表的不同类型