Я пишу виртуальную машину с сборщиком мусора, которая, когда ему не хватает памяти, выделяет большой кусок памяти. Мне нужно реализовать делегатов, которые вы можете конвертировать (аналогично C #) A.B(C)
просто D()
(D — переменная делегата).
Мое решение: чтобы создать их динамически, я подумал о генерации функции во время выполнения и сохранении их в GCHeap (мне нужно в GCHeap, потому что это может быть недоступно в будущем), но чтобы запустить их, мне нужно сделать всю память в GC отмечен как исполняемый, записываемый и читаемый.
Повлияет ли это на производительность доступа к памяти, которая не является делегатом, но все еще помечена этими разрешениями? Есть ли лучшее решение?
ПРИМЕЧАНИЕ. Я знаю, что эти разрешения позволяют генерировать исключения, когда программа не работает должным образом, выполняя память, которая не предназначена для выполнения, но я не могу позволить себе потерять производительность выделения больших кусков.
Вместо пометки областей памяти, которые могут создавать проблемы безопасности. Вы можете, например, развернуть во время компиляции: (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);
}