无心人 发表于 2008-3-14 07:55:47

大数库的临时变量管理

我之所以提寄存器
源于那本加密方法的C/C++实践

临时变量你可以只保留基本指针
用到时分配空间
或者用动态增长
比如一旦不够, 以双倍长度增长
那就和DLL无关了

主要是方便管理
否则你如何实现 (a + b) * (c +d)的功能啊

无心人 发表于 2008-3-14 08:03:25

比如开始就128双字
不够就256双字

超过65536双字
一旦销毁,则重新初始化到小于等于65536双字

销毁时机
我觉得就是复制的时候和参与逻辑运算的时候
假设设定标志n代表运算模块的编号, n可重分配
在运算中, 一旦有临时变量,则对其标n
当可以销毁时,对所有标志n的做销毁

gxqcn 发表于 2008-3-14 08:17:22

原帖由 无心人 于 2008-3-14 07:55 发表 http://images.5d6d.net/dz60/common/back.gif
...
你如何实现 (a + b) * (c +d)的功能啊

在当时设计算法库之初,我就想实现类似混合四则运算的功能,且代码要与人们的思维习惯尽量保持一致,
最后选择了C++,并充分利用其运算符重载功能去完美实现。
也正就是通过这个业余项目,使我的C++、C、汇编等编程经验逐渐丰富起来的。

无心人 发表于 2008-3-14 08:37:53

我也重载过操作符啊

关键是这种运算依赖的是已被销毁的但还存在的内存影像
当运算复杂时候,肯定存在问题

也许某些编译器会初始化引用做返回对象
但不知道能不能不出问题

你做这个运算
( (a + b) * ( c + d)+ e) / ( a + c) + 2
当运算越来越复杂时(当然理论上, 实际不用考虑这么多, 看你要完备还是要小巧)恐怕遇到当你需要返回值却无法得到引用内存,因为已被系统销毁

在传统除法里存在内存分配,你验证下
是否会存在引用失效

我当时的编译器是BC++3.1 386SX
也许新的不存在问题
但难说啊

无心人 发表于 2008-3-14 08:39:48

可惜那个测试代码随386SX一起死亡了
只保存了在论坛帖的部分代码

后来我也自己Cancel掉了一些代码
现在后悔了
:(

看这里
http://www.99inf.net/SoftwareDev/VC/28450.htm

gxqcn 发表于 2008-3-14 08:47:43

重载运算符,对定义是非常讲究的,且构造函数一定要事先实现充分。
这是其关键点。

无心人 发表于 2008-3-14 09:03:53

如果靠拷贝构造函数做重载运算符
将遇到内存分配来分配去的问题
效率不高, 因为都是临时的
考虑过, 是最低要求
应该有更好的

mathe 发表于 2008-3-14 09:06:53

你这里所说的功能基本上用内存池就应该可以支持了。

无心人 发表于 2008-3-14 09:09:36

要是内存池能解决也就没这个帖子了
关键是要提供定制的内存池
什么时候销毁,系统能替你做决定么?
虽然是内存池类似物
也可用内存池解决
好歹要写个全局内存管理类吧
内存池属于实现的具体细节

mathe 发表于 2008-3-14 09:37:47

一个变量什么能够销毁,仅仅靠库文件是很难决定的。变量的作用域是由编译器决定的。
而使用内存池能够做的就是可以延缓变量的销毁(这时如果有新的变量要申请,可以重用而已)。
其实真的要解决这些问题,还是直接在编译器内部支持大数作为一个普通数据类型是最好的解决方法。
脱离了编译器的支持(现在的情况),想再怎么优化,也有限得很
页: [1] 2
查看完整版本: 大数库的临时变量管理