×
Namespaces

Variants
Actions

Symbian基本规范:代码效率

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

文章
beover1984 在 19 Aug 2007 创建
最后由 hamishwillee 在 19 Oct 2011 编辑
翻译自SDK » Developer Library » Symbian OS Guide » Essential idioms » Code efficiency

概要 速度和资源使用方面的代码效率总是值得关注的,本节提出的方法对Symbian平台的开发者来说是很常用的。

栈应用 应用程序中的每个线程都有一个8Kb的标准栈,应当小心地使用。因此:

Ø 除了基本类型避免值拷贝。

Ø 应该在堆上而不是栈上创建任何大的对象或数组。

Ø 通过适当的域最小化自动变量的生命周期。

最后一点可以通过下面的例子说明:

void ABadFunction()
{
TBigObject Object1;
TBigObject Object2;
TBigObject Object3;
 
GetTwoObjectValues(Object1,Object2);
Object3=SumObjects(Object1,Object2);
FunctionWithUnknownStackOverhead(Object3);
}

上面的代码中,对象Object1和Object2一直占用栈并贯穿到FunctionWithUnknownStackOverhead()的生命周期中,即使那时已不需要使用它们。它们应当在调用发生之前从栈上删除。可以用下面的方法实现:

void ABetterFunction()
{
TBigObject Object1;
 
GetTotalObjectValues(Object1);
FunctionWithUnknownStackOverhead(Object1);
}
 
void GetTotalObjectValues(TBigObject &aObject)
{
TBigObject Object1;
TBigObject Object2;
 
GetTwoObjectValues(Object1,Object2);
aObject=SumObjects(Object1,Object2);
}

通过把代码分离到两个函数中,你可以确保栈的使用符合需求。

函数重载 如果一个函数有缺省参数并经常以缺省值进行调用,应当考虑提供一个没有参数的重载函数。这是因为每次提供缺省参数会使编译器在函数被调用的地方产生额外的代码。 例如有下面的函数:

void FunctionOne(TInt aInt=0);

在代码中经常以下面形式调用:

FunctionOne();

这时应考虑提供一个下面这样的函数:

void FunctionOne()
{
FunctionOne(0);
}

指针和引用 使用引用做为函数参数比指针更有效率。这是因为编译器不得不维护空指针通过所有的转换。 假设一个类CXxx从混合类Myyy派生:

class CXxx : public CBase,public MYyy {...};

在传递一个CXxx指针到参数为Myyy指针的函数时,编译器不得不把把指针加上sizeof(CBase),除非这个指针为空。例如cp是一个CXxx指针并且Func()的参数为Myyy指针,在执行Func(cp)调用时就会像下面这样:

Func((MYyy* aM)(cp==NULL ? NULL : (TUint8*)cp+sizeof(CBase)));

因为引用不能为空,所以在使用时不用判断它是否为空。在ARM处理器上,CXxx*转换到MYyy*需要8条指令,但是CXxx&转换到MYyy&只需要2条指令。

浮点数运算 浮点数运算效率很低,因此有必要找出一种只使用整数运算的算法。 例如下面的例子,aTop和aBottom是Tint类型:

TReal a = (TReal)aTop;
TReal b = (TReal)aBottom;
TReal c = a/b;
TReal result;
Math::Round(result,c,0);
return (TInt)result;

可以换成下面效率更好的代码:

return((2*aTop+aBottom)/(2*aBottom));

内联函数 内联函数通过消除函数调用来提高代码的速度,并且保持它的模块化特征。然而在使用它之前需要确定两个问题: Ø 代码简洁性:有限的存储资源意味着函数调用的开销要比使用很大的内联函数更好。 Ø 二进制兼容性:更改内联函数的实现会破坏程序的二进制兼容性。如果代码要被其他开发者使用这点是很重要的。 内联函数通常在下面的情况中使用: Ø 取得和设置一到两个机器字的值,例如:

inline ConEnv() const { return iConEnv; };

Ø T类的简单构造函数:

inline TPoint::TPoint(TInt aX, TInt aY) { iX=aX; iY=aY; };

Ø 在瘦模板中的用法:参考:SDK» Developer Library » Symbian OS Guide » Essential idioms » Thin templates Ø 那些映射其它运算的函数,并且确定其中的运算符,函数或模板的定义不轻意改变,例如:

template <class T> inline T Min(T aLeft,T aRight)
{ return(aLeft<aRight ? aLeft : aRight); }

删除指针时不用做是否为空的判断 C++规定delete 0不做任何事,因此从不需要写下面类似的代码:

if (iX)
delete iX;
This page was last modified on 19 October 2011, at 07:49.
92 page views in the last 30 days.
×