gxqcn
发表于 2010-8-5 10:00:09
Add、Sub 分别对应于运算符“+=”、“-=”,这已是内部最高效的运算方式,
如果是递增或递减,可用“++”、“--”,分前置后后置两种。
forcal
发表于 2010-8-5 10:05:02
“+=”不是这种运算吗:a=a+b,即a+=b。
但我想实现a=b+c,最高效的函数是什么?如果用重载的运算符似乎会产生临时变量。
gxqcn
发表于 2010-8-5 10:21:53
a=b+c,最高效的方式是:(a=b)+=c,或 (a=c)+=b
如果b里的值无需保留,还可更高效:a.Swap(b+=c)
forcal
发表于 2010-8-5 10:33:09
a=b+c,最高效的方式是:(a=b)+=c,或 (a=c)+=b
如果b里的值无需保留,还可更高效:a.Swap(b+=c)
gxqcn 发表于 2010-8-5 10:21 http://bbs.emath.ac.cn/images/common/back.gif
(a=b)+=c 及 a.Swap(b+=c)会比 Add(a,b,c) 形式更高效吗?这个倒没有测试过,呵呵。
在脚本中这些运算的效率差别是很小的,我只选择效率最高的一种就可以了。
为了不产生临时变量,看来(a=b)+=c 是一个不错的选择。
gxqcn
发表于 2010-8-5 10:40:51
Add(a,b,c) 是 C 的调用方式,当前 HugeCalc 的 C 导出接口是 C++ 导出接口的再包装,
所以用它反而不高效。
而且,调用 C 接口,内部会自动检测其入参的合法性(会全程跟踪鉴别,以便自动销毁用户未释放的对象),多多少少会损失点效率。
forcal
发表于 2010-8-5 10:48:18
还有问题1,在脚本中需要实现的HugeCalc对象已经有HugeInt、HugeIntX、CVECTOR_UINT32 ,再增加CRadixConverter,还有必要实现其他对象吗?是否已经足够?
除了HugeInt、HugeIntX和CVECTOR_UINT32 ,能否简单介绍一下HugeCalc中的其他结构或对象的用途?枚举常量似乎不必单独作为对象来实现。
另外,似乎目前HugeCalc对32位数的运算支持比较好,而Forcal整数是64位,需要进行一些转换。
gxqcn
发表于 2010-8-5 10:57:15
CRadixConverter 不必用,它仅仅是个高级进制转换器,更多的是内部调用,
把它导出来,并增强了功能(各种进制之间可相互快速转化),只是更多的方便高级用户而已。
HugeCalc 有部分函数是直接支持64位的,要想全面支持要等x64版的HugeCalc了。
“枚举常量似乎不必单独作为对象来实现”这句话没明白,哪个枚举常量作为对象来实现了?
forcal
发表于 2010-8-5 11:07:41
“枚举常量似乎不必单独作为对象来实现”这句话没明白,哪个枚举常量作为对象来实现了? gxqcn 发表于 2010-8-5 10:57 http://bbs.emath.ac.cn/images/common/back.gif
看到HugeCalc 中定义了一些enum ,我的意思是脚本中可不出现这些enum ,若用到用相关函数设置即可。当然,定义成相关的常量也可以。
gxqcn
发表于 2010-8-5 11:23:22
枚举与普通常量的区别在于:前者可取值范围固定,内部无需参数合法性检查。
当然,你定义成相关的常量也可以。
forcal
发表于 2010-8-5 11:47:02
HugeCalc 可自动管理临时变量,Forcal脚本运算代码也将产生一些临时变量,不知将HugeCalc 中的临时变量作为Forcal的临时变量是否可以?
具体来说,脚本中有a+b产生一个临时变量,我直接用HugeCalc 中的a+b产生的临时变量是否可以呢?
HugeCalc 中的a+b产生的临时变量一般何时销毁?若在Forcal中临时变量生命周期结束前销毁肯定是不行的。能否控制HugeCalc 临时变量的生命周期?
另外,(a+b)*(a+b) 共产生3个临时变量,但有两个是(a+b)产生的,这两个临时变量的内存地址是否相同?