C++代码优化

简介: 列举了游戏服务器开发过程中应当注意的一些规范,以保证我们服务器代码具有更高的可读性、可维护性以及更高的稳定性和运行效率。

列举了游戏服务器开发过程中应当注意的一些规范,以保证我们服务器代码具有更高的可读性、可维护性以及更高的稳定性和运行效率。


  1. 定义struct必须要在构造函数中对所有成员变量进行初始化。


这样可以确保一个对象生成时,其所有成员变量都有可知的固定的初值,而不是系统分配的初值。另外,尽量使用初始化列表的方式对复杂数据类型的成员变量进行初始化,这样可以只调用一次拷贝构造函数,不需要调用赋值操作符,代码更高效。


  1. 自增自减操作符在不是必要的时候全部使用前置操作符。


++i比i++具有更少的汇编指令,虽然编译器优化后这两条语句可能完全相同,但是养成良好的代码风格也很重要。


  1. 无符号整数与0比值直接使用==判断。


不需要使用<=,因为无符号整数永远不可能小于0。同样的,判断一个无符号整数>=0也是没有意义的。


  1. 浮点数的比较。


  1. 使用typedef对较长的类型定义进行重命名。


这样可以使该类型使用地方的代码更加有可读性,也减少了代码出错的可能。


  1. 减少局部变量不必要的初始化。


这种情况大部分是写代码时粗心造成的。主要是为了节省性能(个人感觉初始化还是必要的)


  1. 非基本数据类型作为函数参数不要使用值传递。


非基本数据类型是指int、float、char这些C/C++基本类型之外的数据类型,比如std::string和自己定义的struct等。非基本数据类型一般是由多个基本数据类型组成的,如果值传递会进行大于4个字节的内存拷贝,严重影响效率。而函数参数无外乎有两种情况,一种是函数内部不会改变参数的值,另一种的函数内部需要改变参数的值。前者使用const引用或者const指针,后者使用引用或指针,就能解决所有需求,因此非基本数据类型以值传递的形式作为函数参数是没有必要的。另外,基本数据类型作为函数参数如果函数内部不需要改变值的话建议直接值传递。


  1. 类成员变量数组大小避免直接使用数字。


定义一个常量作为数组的大小使代码更易维护,也能减少数组越界等bug的出现几率。


数据结构优化


一)    选择合适的算法和数据结构


1)如果固定大小,并且随机访问就用数组


  1. 如果数据大小不固定,并且涉及大量的插入和删除操作,使用链表


3)如果涉及海量数据,并且要求高效的查找就用map


二)查表


1)客户端程序经常用到的sin cos等值可以再初始化的时候计算出(0-360度)的值保存在表里,用的时候直接使用 (空间换时间)


运算符优化


1)取余用与(&)替换


2)乘与除2的倍数可以用位移操作来替换


3)除法可以用乘法替代


语句优化


一)顺序语句的优化


1)相同功能的代码放在一个语句块,避免出现开头定义了一个变量


几百行代码后才引用


2)尽量多用中间变量保存代码块重复引用的值


二)if swtich 语句的优化


嵌套if把执行几率小的判断放在前边


Switch


使用跳转表


switch语句执行的时候并不是和if elseif 一样傻傻的一个一个去执行,而且把左右跳转地址保存起来,如果是连续的只需要一个跳转表,如果case不连续的就需要两个挑战表,从表A就是上边0x4140a8地址找到实际的跳转偏移看到了把1-3是跳转偏移是,后边3-100全部是04然后在存储实际的跳转地址0x414094+偏移找到跳转地址,过去


三)循环语句的优化


1)循环展开


4)多重循环的时候一定要注意内循环的效率,因为内循环执行的次数是最多的。


AStyle 格式化代码


&AStyle


C:\ProgramFiles (x86)\Microsoft Visual Studio 8\Common7\Tools\AStyle.exe


-A1 -s4 -c-K -w -m0 -M80 -j -H -p -U -Y -N -k2 (ItemDir)(ItemDir)(ItemDir)(ItemFileName)$(ItemExt)


$(ItemDir) ———————————————— 版权声明:本文为CSDN博主「香菜聊游戏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

目录
相关文章
|
6月前
|
算法 Linux 测试技术
Linux C++开发中的代码优化之道:把握时机与策略
Linux C++开发中的代码优化之道:把握时机与策略
94 0
|
C++ 计算机视觉
《深入应用C++11:代码优化与工程级应用》勘误表
转自:http://www.cnblogs.com/qicosmos/p/4562174.html   整理一下吧,原文好乱。
1322 0
|
人工智能 C++
C++编译器到底能帮我们把代码优化到什么程度?
一个简单的累加求和程序: 01.TYPE S=0; 02.for(int i = 0;i < SIZE; i++) { 03. S += a[i]; 04.} 很多人都觉得这个程序写得不好,编译器不能生成很好的汇编代码。
857 0
|
人工智能 C++ 编译器
C++编译器到底能帮我们把代码优化到什么程度?
TODO: 用while写法的程序会不会循环展开? 本文地址:http://blog.csdn.net/hengyunabc/article/details/7170865 一个简单的累加求和程序: TYPE S=0; for(int i = 0;i < SIZE; i++) { S += a[i]; } 很多人都觉得这个程序写得不好,编译器不能生成很好的汇编代码。
844 0
|
4天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
22 4
|
6天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
18 4
|
28天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
25 4
|
28天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
20 4
|
28天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
19 1
|
1月前
|
存储 编译器 C++
【C++类和对象(下)】——我与C++的不解之缘(五)
【C++类和对象(下)】——我与C++的不解之缘(五)