注册 登录
编程论坛 VFP论坛

关于类实例化后内存大小的变化

easyppt 发布于 2025-07-22 17:19, 1113 次点击
有一个疑惑,求解:



实例化类时,内存占用也会变大吗?

比如代码:  
lobject1 = createobject('myClass1') && 假设该类,存在很多自定义属性和方法,大小在 :10M
lobject2 = createobject('myClass2') && 该类 大小仅2K(很小)


这2句执行后,内存占用会受 类自身大小 而变大吗?

即lobject1 占用的内存 比 lobject2 大吗?
仅限 在编译后的EXE执行时,实例化这句后占用的内存,

提出这个疑问是因为:这个类会存在很多实例化对象,每个对象会作为参数传递给别的对象,接收这个对象的对象其实只用到参数对象中很少的属性
所以:如果内存占用很大,我就把这个类中需要用到的 几个属性 单独创建一个新类,用于参数。
如果实例化对象很小,就不拆分了。

不清楚,VFP的实例化类对象的 工作原理是啥情况



14 回复
#2
schtg2025-07-22 17:44
可问一下DS
#3
kangss2025-07-22 18:55
我一般情况下,功能近似,同一个exe使用的,放到一个类文件中。不同的exe之间的类文件尽量另存为其它名字。
多个不同功能的类放到同一个类文件中,后期开发其它项目时,会造成exe、内存占用增大
#4
xinjie2025-07-22 20:26
如果类之间存在继承关系,那么区别应该不是很大。
如果你认为“存在很多实例化对象”会占用大量内存,可采用亨元模式避免大量内存的占用,代价就是可能需要牺牲执行速度。
#5
ccb20002025-07-23 11:03
传递对象参数,总是按SET UDFPARMS REFERENCE处理,不会重建一份对象属性的拷贝。

如果子程序修改了对象属性,也同时修改了主程序的对象属性。

测试例子:

do test with thisform

proc test
para x1
x1.caption="test"

#6
schtg2025-07-23 11:05
回复 5楼 ccb2000
学习啦,谢谢!
#7
sam_jiang2025-07-24 01:05
回复 6楼 schtg
都研究这么深奥的问题了吗?
#8
schtg2025-07-24 06:41
回复 7楼 sam_jiang
学习哈,没有研究哦。
#9
easyppt2025-07-24 11:14
回复 5楼 ccb2000
请教 ccb 老师一个问题:

VFP的变量 在内存中是明文吗?

另:如果是明文的话,使用内存加密对VFP有效吗,代码如下:

DECLARE INTEGER CryptProtectMemory IN "Crypt32.dll" ;
    STRING @pData, INTEGER cbData, INTEGER dwFlags

DECLARE INTEGER CryptUnprotectMemory IN "Crypt32.dll" ;
    STRING @pData, INTEGER cbData, INTEGER dwFlags

* 加密数据
cSecret = "MyPassword"
nSize = LEN(cSecret)
= CryptProtectMemory(@cSecret, nSize, 0)

谢谢!

#10
ccb20002025-07-24 17:33
VFP的变量在内存中是明文。

* 加密数据
cSecret = "MyPassword"
nSize = LEN(cSecret)
= CryptProtectMemory(@cSecret, nSize, 0)
?cSecret

#11
吹水佬2025-07-24 20:23
回复 楼主 easyppt
应该要视具体情况
1.每个实例(对象)有独立空间(不共享),静态的可有例外(可共享)
2.对于不同的实例(对象)谁占用空间大,不一定类成员多就占用大,要看类成员的具体情况,如某个类成员占用空间是动态的,大小是变动的。
#12
hsfisher2025-07-25 08:19
学习啦
#13
easyppt2025-07-25 17:12
以下是引用ccb2000在2025-7-24 17:33:30的发言:

VFP的变量在内存中是明文。

* 加密数据
cSecret = "MyPassword"
nSize = LEN(cSecret)
= CryptProtectMemory(@cSecret, nSize, 0)
?cSecret


Windows系统会不会控制仅限创建数据的进程对象可以读取,其他对象无法正常读取,
这个我不懂,只是猜测
有没有内存数据查看工具,用第三方工具查内存数据,会不会是加密的,不然的话,这个函数又起什么作用呢
#14
whinda2025-07-28 16:40
内存加密本身毫无意义。不同于网络通信采用公-私钥,通过单向函数来检测,本机运行的所有程序,其数据的最终的解密检测都会采用明文-解密后内容比较的形式来验证是否正确。查看和编辑内存的常用工具WinHex,单机游戏时代的金山游侠5,都可以监视内存变化情况,把内存数据按一定的字节数来显示和修改。
#15
吹水佬2025-08-06 14:59

以下是引用ccb2000在2025-7-24 17:33:30的发言:

VFP的变量在内存中是明文。

* 加密数据
cSecret = "MyPassword"
nSize = LEN(cSecret)
= CryptProtectMemory(@cSecret, nSize, 0)
?cSecret

以下是引用easyppt在2025-7-25 17:12:11的发言:
Windows系统会不会控制仅限创建数据的进程对象可以读取,其他对象无法正常读取,
这个我不懂,只是猜测
有没有内存数据查看工具,用第三方工具查内存数据,会不会是加密的,不然的话,这个函数又起什么作用呢


跨进程内存也可以读写,本进程就肯定可以。
上面的代码执行CryptProtectMemory很有可能返回0(加密失败),这样执行后看到的还是明文。
CryptProtectMemory处理内存是按16字节对齐。
只有本站会员才能查看附件,请 登录

程序代码:

DECLARE long CryptProtectMemory   IN dpapi string@,long,long
DECLARE long CryptUnprotectMemory IN dpapi string@,long,long

cSecret = "MyPassword"
? "字符串:",cSecret, STRCONV(cSecret,15)

nSize   = BITAND((LEN(cSecret)+15), BITNOT(15))
cSecret = PADR(cSecret, nSize, 0h00)

? CryptProtectMemory(@cSecret, nSize, 0)
? "加密后:",cSecret, STRCONV(cSecret,15)

? CryptUnprotectMemory(@cSecret, nSize, 0)
? "解密后:",cSecret, STRCONV(cSecret,15)





[此贴子已经被作者于2025-8-6 15:01编辑过]

1