2014-07-17 71 views
0

您好在學習C++/cli的過程中,併爲此閱讀本書的專家C++/cli。在作者陳述的書「 」中,編譯器選項/ clr:pure仍允許您將現有的C++代碼編譯爲託管代碼(源代碼兼容性)「。這是否意味着現有的本機代碼可以使用/ clr:pure重新編譯在CRT堆中初始化的對象?本地C++項目可以使用/ clr重新編譯:純

更新1:例如Can 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編譯:純)可以包含天然和 管理的數據類型,但僅管理功能

/clr:純

生成僅具有本機可執行代碼的Microsoft中間語言(MSIL)輸出文件。但是,它可以包含編譯爲MSIL的本機類型。

從我的理解(我可能錯在這裏)test = new A();生成本地代碼,因此無法使用/ clr:pure進行編譯。如果我錯了,任何一個可以給我

  1. 本機函數的例子(如MSDN規定只有管理功能 允許)
  2. ,可以用/ CLR和 被編譯的類的實例不使用/ clr:純

感謝

+0

類不會被初始化,對象會這樣做。提供您正在討論的本機代碼的示例。 –

+0

@BenVoigt對不起,我的錯誤。我已更正它,併發布了一個簡單的代碼示例 – user119020

+0

當執行'/ clr:pure'時,將管理所有功能。請注意,您仍在使用本地庫調用 - 使用'/ clr:pure',那些將使用p/invoke而不是IJW C++ interop來執行。 –

回答

4

當然,這是可能的,任何C++ 03標準的C++代碼可以被轉換成MSIL,並在運行時實時編譯成機器代碼。

然而這是一個相當毫無意義的事情,你沒有得到可驗證的代碼。該程序與原生C++一樣「不安全」,指針仍然像指針一樣破壞內存。你不會得到垃圾收集器的愛。你得到的唯一好處是建築獨立性。最重要的是編譯時優化器。 MSIL得到了優化,但是在運行時花費很少時間的實際限制的情況下完成了它,但它不能做得差不多。在通緝列表中添加諸如自動矢量化和自動並行化之類的東西。

使用/ clr:pure和/ clr:安全只在2005年纔有意義,Stanley Lippman等人致力於使C++成爲託管.NET世界的頭等公民。這並不是那樣的,一點都不是,因爲當他們完成時,每個人都放棄了,這種語言現在被假定爲互操作語言。這是非常好。這些選項位於不贊成使用的列表之上,只有plain/clr會有未來。

+0

C++編譯器仍然比示例C#做了更多的優化。像模板這樣的東西可以實現比其他.NET語言更低的開銷泛型編程。所以一般來說,優化排序是(最好的)本地C++,'/ clr'項目的一部分,帶有'#pragma unmanaged',C++/CLI代碼和'/ clr:pure','/ clr:safe',其他.NET語言最差) –