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

标签 .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 创建后的位置可以改变吗?我知道,如果它存在于底层的 native 堆栈中,那么它就不会改变,但是随着 .Net 创建的额外抽象层,我不知道它是否会在内存中移动。

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

最佳答案

不,您可以使用此代码。垃圾收集器只移动在 GC 堆上分配的托管(ref 类)对象。它不会混淆堆栈或 JIT 编译代码。

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

关于.net - 在(托管)堆栈上的托管 C++/cli 中创建的 std::vector 可能会更改内存位置吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3988492/

相关文章:

c++ - 将堆分配的引用分配给堆栈分配的变量

c++-cli - 在 NUnit 中使用 C++/CLI 的限制

c++ - 将 String^ 转换为 const char*

比较内存地址

c++ - 从变量写入地址值?

mfc - 来自 MFC 扩展 DLL 的 C++/CLI

asp.net - Telerik 控件未加载。我错过了什么?

.net - 在不使用 WindowsFormsHost 的情况下在 WPF 中查看 PDF

c# - 通过控制台应用程序进行 UrlEncode?

c# - 制作接收azure订阅数据的应用程序