Делает ли память читаемой, записываемой и исполняемой предметом какое-либо влияние на производительность?

Я пишу виртуальную машину с сборщиком мусора, которая, когда ему не хватает памяти, выделяет большой кусок памяти. Мне нужно реализовать делегатов, которые вы можете конвертировать (аналогично C #) A.B(C) просто D() (D — переменная делегата).

Мое решение: чтобы создать их динамически, я подумал о генерации функции во время выполнения и сохранении их в GCHeap (мне нужно в GCHeap, потому что это может быть недоступно в будущем), но чтобы запустить их, мне нужно сделать всю память в GC отмечен как исполняемый, записываемый и читаемый.

Повлияет ли это на производительность доступа к памяти, которая не является делегатом, но все еще помечена этими разрешениями? Есть ли лучшее решение?

ПРИМЕЧАНИЕ. Я знаю, что эти разрешения позволяют генерировать исключения, когда программа не работает должным образом, выполняя память, которая не предназначена для выполнения, но я не могу позволить себе потерять производительность выделения больших кусков.

2

Решение

Вместо пометки областей памяти, которые могут создавать проблемы безопасности. Вы можете, например, развернуть во время компиляции: (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);
}
0

Другие решения


По вопросам рекламы [email protected]