您好我正在学习c ++ / cli的过程,并为此阅读了专家c ++ / cli。 在书中作者声明“编译器选项/ clr:pure仍允许你 将现有的C ++代码编译为托管代码(源代码兼容性)“。这是否意味着现有的本机代码可以使用/ clr:pure?
重新编译CRT堆中初始化的对象?更新1:例如,可以使用/ clr:pure?。
编译B类Class A {
Public :
A()
{
}
~A()
{
}
void Foo()
{
}
};
Class B {
Public :
A* test;
B()
{
test = new A();
test->Foo();
}
~B()
{
delete test;
}
};
MSDN声明
纯程序集(使用/ clr:pure编译)可以包含native和 托管数据类型,但只有托管函数
和
/ CLR:纯
生成Microsoft中间语言(MSIL) - 仅具有本机可执行代码的输出文件。但是,它可以包含编译为MSIL的本机类型。
从我的理解(我可能在这里错了)test = new A();生成本机代码因此无法使用/ clr:pure编译。如果我错了可以任何人给我一个例子
由于
答案 0 :(得分:4)
当然,这是可能的,任何符合C ++ 03标准的C ++代码都可以转换为MSIL并在运行时附加到机器代码。
然而,这是一个相当无意义的事情,你没有得到可验证的代码。该程序与原生C ++一样“不安全”,指针仍然是像往常一样破坏内存的指针。你不会得到垃圾收集器的爱。你得到的唯一好处是架构独立性。减去最重要的是编译时优化器。 MSIL得到了优化,但这是通过在运行时花费很少时间的实际约束来完成的,它几乎不能做好工作。在想要的列表上添加自动矢量化和自动并行化等内容。
使用/ clr:pure和/ clr:safe仅在2005年有意义,Stanley Lippman等人致力于使C ++成为托管.NET世界中的一等公民。这并不是那么好,至少因为每个人在完成时都会退出,语言现在被假定为互操作语言。它非常非常好。这些选项位于已弃用的列表之上,只有plain / clr才会有未来。