我正在编写具有垃圾收集器的虚拟机,当他耗尽内存时,他会分配大块内存。我需要实现你可以转换的代理(类似于C#)A.B(C)
只需D()
(D是委托变量)。
我的解决方案:为了动态创建它,我考虑在运行时生成函数并将它们存储在GCHeap中(我需要在GCHeap中,因为它将来无法访问),但要运行它们我需要制作整个GC中的内存标记为可执行,可写和可读。
它是否会影响访问不是代理但仍被这些权限标记的内存的性能?有更好的解决方案吗?
注意:我知道这些权限是在程序无法正常工作时通过执行不可执行的内存而抛出异常,但我不能失去大块分配的性能。
答案 0 :(得分:0)
而不是标记可能导致安全问题的内存区域。例如,您可以在编译时扩展:( C#作为伪代码)
public static Func<???> Method() { //Not the same Func as C#'s implementing, and ??? is the return type.
MyClass A=...,C=...;
return ( ) => A.B(C);
}
要:
class __call001 /* Anonymous type */ : Func<???> {
MyClass var0, var1; //Storing those variables,
//because we won't have them available when calling the lambda.
public __class001(MyClass var0, MyClass var1) {
this.var0=var0;
this.var1=var1;
}
public override ??? operator() {
var0.B(var1);
}
}
...
public static Func<???> Method() {
MyClass A=..., C=...;
return new __call001(A, C);
}