在(托管)堆栈上托管C ++ / cli中创建的std :: vector可能会更改内存位置吗?

时间:2010-10-21 14:24:33

标签: .net memory c++-cli

如果在C ++ / cli中我写

ref class test {
    void method() {<
       std::vector<float> my_stack_vector;
       native_function_call( & my_stack_vector );
    }    
};

my_stack_vector的位置在创建后是否会发生变化?我知道,如果它存在于底层的本机堆栈中,那么它就不会改变,但是通过额外的抽象层.Net创建我不知道它是否会受到内存的影响。

更重要的是,我如何为自己验证,例如在运行时或其他地方将ILDASM编译成本机代码以便能够在将来自己回答这些问题后,我会在使用ILDASM或原生反汇编时寻找什么?

1 个答案:

答案 0 :(得分:3)

不,你对这段代码没问题。垃圾收集器仅移动在GC堆上分配的托管(ref类)对象。它不会弄乱堆栈或JIT编译代码。

你不必担心会引发这样的错误,编译器会一直警告你。例如,尝试将向量作为类的成员。现在这将是一个问题,GC 移动“test”类型的对象。