优化:尽量用memset将一个数组设置清零,而不是通过for循环逐个置

本文也是对自己对工作经验中的一个小小的总结,主要上memset及清0的一些小小的技巧,哈,这些都是很基础的,牛人可以视而不见,就当我没说,我也只是这段时间闲着,所以干脆顺便写点小心得,献丑了。

优化:尽量用memset将一个数组设置清零(带虚类除外),而不是通过for循环逐个置0

下面这个例子,大家可以参考:3D游戏编程大师技巧。本文其实重点是memset,原因是在工作中,用的比较多。

例如:要清空一个floatf[10000],应该用memset(f,0,sizeof(float) * 10000);

而不是:for(int i=0; i<10000; ++i) f[i] = 0;

当然,还可以用内嵌汇编的形式:

_asm
{
mov edi,f;// edi指向数组地的目标内存的起始处
mov ecx, 1000/4; // 循环次数或移动次数
mov eax,0;// 每一次移动32位数,都置0
repstosd;// 移动数据
}

哈,这个准则有个前提,那就是带虚的类除外,原因是,memset将类清空,有可能将虚表也给置0了。

有可能是因为:类的创建分:栈上和堆上。

如果在栈上,那么栈对象的虚函数调用可能会在静态时确定,从而绕过虚表。所以不会出错。

但堆上就一定会出错,下面给出测试代码:

********************************************************************
** 创建人:蔡国武
** 日 期:2011/5/27 14:21
** 版 本:1.0
** 描 述:代码性能优化与技巧----测试
测试:在堆和栈上创建的带虚类的memset清零后,虚表是否失效

** 应用:尽量用memset将一个数组设置清零(带虚类除外),而不是通过for循环逐个置0

**************************** 修改记录******************************
** 修改人:
** 日 期:
** 描 述:
********************************************************************/

class CMemsetVirtualTest // 测试 带虚类,被memset为0后,虚表是否失效
{
public:
CMemsetVirtualTest()
{
memset(this,0,sizeof(CMemsetVirtualTest));
}

virtual voidNormalFun()
{
cout<<"test:NormalFun()虚表指针有效"<<endl;
}

virtual~CMemsetVirtualTest()
优化:尽量用memset将一个数组设置清零,而不是通过for循环逐个置
{
cout<<"test:~CMemsetVirtualTest()虚表指针有效"<<endl;
}
};

void testFun1() // 测试:栈上建立的对象
{
CMemsetVirtualTest Ctest;
Ctest.NormalFun();
}

void testFun2() // 测试:堆上建立的对象
{
CMemsetVirtualTest* Ptest = newCMemsetVirtualTest();
Ptest->NormalFun(); //到这里一定会暴掉
deletePtest;// 如果屏蔽上句,到这里也一定会暴掉
}

int main()
{

CMemsetVirtualTest Ctest;// 测试:栈上建立的对象

Ctest.NormalFun();// 测试正常:

CMemsetVirtualTest* Ptest = newCMemsetVirtualTest(); // 测试:堆上建立的对象
Ptest->NormalFun(); //到这里一定会暴掉
deletePtest;// 如果屏蔽上句,到这里也一定会暴掉
}

即:

在C++中,涉及虚技术的类,他的对象内存区块中就不单纯是用户定义这个类时看上去的那些数据结构,编译器会在当中安插一些数据或代码,用来实现响应的虚技术.于是当你用memset函数时会把这些编译器安插的东西冲掉,程序执行结果变得未知. 这时候如果拷贝对象C++会使用memberwise拷贝,此时编译器既拷贝用户定义的数据结构,还会对支持虚技术的相关设施进行适当的修改.
如果对象没有用到虚技术,那么就可以使用memset,就跟正常情况一样,可以逐位拷贝.

  

爱华网本文地址 » http://www.aihuau.com/a/25101017/356742.html

更多阅读

白立新:学习联想,而不是华为

华为告诉你如何快跑;联想告诉你快跑途中摔倒之后如何站起来继续快跑。  毫无疑问,华为是目前最优秀的中国企业。华为的成功来自于四个方面:机遇、战略、创始人、企业文化。  1. 机遇,可遇而不可求。上个世纪九十年代被称为“电信的十

李阳:快乐的去得到,而不是得到再快乐

李阳的16字启示过程密码的核心口诀是一句话:快乐的去得到,而不是得到再快乐。   我很喜欢李阳的话—人要热爱丢脸,欢迎挫折,享受痛苦,追求成功。  我们多少次让自己相信,当我们结婚后,有了孩子以后,或者其它的什么事情之后,我们会更加

杰姆·罗杰斯:只看好商品,而不是货币

 吉姆·罗杰斯在香港召开的第二届亚洲金融论坛上又语出惊人:下次你们见到我的时候,我不会持有任何美元。   “只看好商品”  一直以来,罗杰斯都强调自己看好商品,而不是货币、股票或是债券。到昨天为止,看起来情况还是这样。在罗

达贝妮:青春应该是有积累和历练的,而不是虚无的

  摘自达贝妮博客《看IT前台MM评比所感》(2007-12-09 20:52)  印象当中,IT公司缺少美女。就如当年我们交大流行的那句:“交大无美女。”还有那交大美女十回头的小调:“交大美女一回头,吓倒北区三排楼;交大美女二回头,小平南巡往回走;交

第11节:同事是氧气,而不是废气(1)

系列专题:《职场女性生存法则:人人都是杜拉拉》  同事是氧气,而不是废气  镜头回放  杜拉拉刚刚担任行政主管,有很多事情拿不定主意,她想到与其他主管交流。上海办行政主管是个烂忠厚没用(或者假装烂忠厚没用)的主,她只好给北京办行

声明:《优化:尽量用memset将一个数组设置清零,而不是通过for循环逐个置》为网友那道傷疤分享!如侵犯到您的合法权益请联系我们删除