【问题标题】:Can a native C++project be recompiled using /clr:pure可以使用 /clr:pure 重新编译本机 C++ 项目吗
【发布时间】:2014-07-17 21:46:03
【问题描述】:

您好,我正在学习 c++/cli 并为此阅读专家 c++/cli 这本书。 在书中作者指出“编译器选项 /clr:pure 仍然允许您 将现有的 C++ 代码编译为托管代码(源代码兼容性)”。这是否意味着可以使用 /clr:pure 重新编译在 CRT 堆中初始化的对象的现有本机代码?

更新 1:例如 Class B 可以用 /clr:pure 编译吗?

Class A {

 Public :
 A()
 {

 }

 ~A()
 {

 }

 void Foo()
 {
 }

};


Class B {

 Public :

 A* test;

 B()
 {
   test = new A();
   test->Foo();
 }

 ~B()
 {
   delete test;
 }

};

MSDN 声明

纯程序集(使用 /clr:pure 编译)可以包含本机和 托管数据类型,但仅限托管函数

/clr:纯

生成仅 Microsoft 中间语言 (MSIL) 的输出文件,没有本机可执行代码。但是,它可以包含编译为 MSIL 的本机类型。

根据我的理解(我可能在这里错了) test = new A();生成本机代码,因此无法使用 /clr:pure 进行编译。如果我错了,谁能给我一个例子

  1. 本机函数(如 MSDN 所述,只有托管函数是 允许)
  2. 可以使用 /clr 和 不是 /clr:pure

谢谢

【问题讨论】:

  • 类不会被初始化,对象会。提供您正在谈论的本机代码示例。
  • @BenVoigt 对不起我的错误。我已更正它并发布了一个简单的代码示例
  • /clr:pure 生效时,所有功能都被管理。请注意,您仍在使用本机库调用 - 对于 /clr:pure,这些调用将使用 p/invoke 而不是 IJW C++ 互操作来执行。

标签: visual-c++ c++-cli


【解决方案1】:

当然,这是可能的,任何符合 C++03 的 C++ 代码都可以转换为 MSIL 并在运行时 jit 为机器代码。

然而,这是一件毫无意义的事情,您不会从中获得可验证代码。该程序与本机 C++ 中的程序一样“不安全”,指针仍然是像往常一样破坏内存的指针。而且你不会得到垃圾收集器的爱。你得到的唯一好处是架构独立性。最重要的是编译时优化器。 MSIL 得到了优化,但这是在运行时几乎没有时间花在它上面的实际限制下完成的,它几乎不能做得那么好。在想要的列表中添加诸如自动矢量化和自动并行化之类的东西。

使用 /clr:pure 和 /clr:safe 仅在 2005 年才有意义,Stanley Lippman 等人致力于使 C++ 成为托管 .NET 世界中的一等公民。但这并没有成功,至少因为每个人完成后都退出了,该语言现在被假定为一种互操作语言。 非常擅长这一点。这些选项在弃用列表的顶部,只有普通的 /clr 才有未来。

【讨论】:

  • C++ 编译器仍然比 C# 做更多的优化。与其他 .NET 语言相比,模板之类的东西可以降低通用编程的开销。所以通常优化排名是(最好的)原生 C++、#pragma unmanaged、C++/CLI 代码和/clr:pure/clr:safe、其他.NET 语言的部分/clr 项目(最差)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 1970-01-01
相关资源
最近更新 更多