C++ 使内存可读、可写和可执行是否会影响性能?

C++ 使内存可读、可写和可执行是否会影响性能?,c++,optimization,vm-implementation,C++,Optimization,Vm Implementation,我正在编写一个虚拟机,它有一个垃圾收集器,当内存用完时,它会分配一大块内存。我需要实现委托,您可以将其转换(类似于C#s)A.B(C)为D()(D是委托变量) 我的解决方案是:为了动态地创建这些函数,我考虑在运行时生成函数并将它们存储在GCHeap中(我需要在GCHeap中,因为它将来可能无法访问),但为了运行它们,我需要将GC中的整个内存标记为可执行、可写和可读 访问非代理但仍由这些权限标记的内存是否会影响性能?有更好的解决办法吗 注意:我知道这些权限是为了在程序无法正常运行时抛出异常,因为执

我正在编写一个虚拟机,它有一个垃圾收集器,当内存用完时,它会分配一大块内存。我需要实现委托,您可以将其转换(类似于C#s)
A.B(C)
D()
(D是委托变量)

我的解决方案是:为了动态地创建这些函数,我考虑在运行时生成函数并将它们存储在GCHeap中(我需要在GCHeap中,因为它将来可能无法访问),但为了运行它们,我需要将GC中的整个内存标记为可执行、可写和可读

访问非代理但仍由这些权限标记的内存是否会影响性能?有更好的解决办法吗


注意:我知道这些权限是为了在程序无法正常运行时抛出异常,因为执行的内存并不意味着是可执行的,但我不能承受失去大块分配的性能。

而不是标记可能会产生安全问题的内存区域。例如,您可以在编译时进行扩展:(C#作为伪代码)

public static Func Method(){//与C#的实现不同,并且???是返回类型。
MyClass A=…,C=。。。;
返回()=>A.B(C);
}
致:

class\uuu call001/*匿名类型*/:Func{
MyClass var0,var1;//存储这些变量,
//因为我们打电话给lambda时没有他们。
公共类001(MyClass var0,MyClass var1){
这个.var0=var0;
这个.var1=var1;
}
公共覆盖???运算符(){
var0.B(var1);
}
}
...
公共静态Func方法(){
MyClass A=…,C=。。。;
返回新的调用001(A,C);
}

否,标记内存区域不应有任何性能影响。但这可能会对安全性产生影响,不需要在运行时生成机器代码来实现委托或类似的操作。事实上,从各个角度来看,这可能都是一个坏主意:除了安全性之外,它需要大量的工作和大量非常容易出错的代码,它需要更多的时间和空间,并且会占用以前的指令缓存(即,它甚至可能更慢)。您应该研究其他虚拟机如何实现一流的函数。@JoachimPileborg我猜到了,但仍然找不到好的源。@kugbu反射从何而来?只需在编译时为调用
a.B(C)
生成一个专门的类型/方法。如果您需要在别处调用
a.B2(X,Y)
,则为其生成另一种类型/方法。使整个堆可执行存在重大安全风险。
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);
}