<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>C++ [Italiano]</title>
        <link>http://blogs.ugidotnet.org/raffaele/category/529.aspx</link>
        <description>Linguaggio C++ (lingua Italiana)</description>
        <language>it-IT</language>
        <copyright>Raffaele Rialdi</copyright>
        <generator>Subtext Version 2.1.0.3</generator>
        <item>
            <title>Bug del compilatore VC++2003 su const volatile</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2005/07/26/24364.aspx</link>
            <description>&lt;P&gt;... bug che non &amp;#232; presente in VC++2005.&lt;/P&gt;
&lt;P&gt;Il linguaggio C++ mette a disposizione molte keyword che non sono indispensabili ma che rendono il sorgente pi&amp;#249; leggibile e rendono possibile un controllo pi&amp;#249; ferreo da parte del compilatore.&lt;/P&gt;
&lt;P&gt;Per esempio &lt;FONT color=#0000ff&gt;const&lt;/FONT&gt; serve per rendere read-only una variabile. Il compilatore permette quinidi la sua inizializzazione ma ci restituisce un errore di compilazione qualora provassimo ad assegnare il suo valore successivamente.&lt;/P&gt;
&lt;P&gt;Questo &amp;#232; un grosso benefit del compilatore perch&amp;#232; &lt;STRONG&gt;&lt;U&gt;gli errori del compilatore sono nostri amici&lt;/U&gt;&lt;/STRONG&gt;. Tutto ci&amp;#242; che ci viene rilevato in compilazione, ci evita grossi problemi successivamente ed &amp;#232; questo il motivo per cui keyword come const andrebbero sempre usate per rendere pi&amp;#249; rigoroso il sorgente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;L'uso di &lt;FONT color=#0000ff&gt;const&lt;/FONT&gt; per esempio fornisce un'immediato guadagno in performance&lt;/STRONG&gt; perch&amp;#233; il compilatore metter&amp;#224; direttamente il valore della costante nel nostro sorgente invece di eseguire l'accesso in memoria alla variabile, risparmiando cos&amp;#236; un'istruzione.&lt;/P&gt;
&lt;P&gt;Pu&amp;#242; capitare per&amp;#242; di avere un dispositivo hardware, un driver, una zona in shared memory che &lt;STRONG&gt;modifica il valore della variabile&lt;/STRONG&gt; dichiarata &lt;FONT color=#0000ff&gt;const&lt;/FONT&gt;, anche se dal nostro sorgente non la modificheremo mai. &lt;STRONG&gt;A questo scopo esiste la keyword &lt;FONT color=#0000ff&gt;volatile&lt;/FONT&gt;&lt;/STRONG&gt;. In pratica avvisa il compilatore di non eseguire alcuna ottimizzazione perch&amp;#232; il valore di quella variabile pu&amp;#242; cambiare al di l&amp;#224; di quello che pu&amp;#242; fare il listato.&lt;/P&gt;
&lt;P&gt;Il seguente sorgente, una semplice console Win32 riproduce il bug del compilatore VC++2003.&lt;/P&gt;&lt;FONT color=#0000ff size=1&gt;
&lt;P&gt;&lt;FONT size=2&gt;#include&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt; "stdafx.h"&lt;BR&gt;&lt;FONT color=#0000ff&gt;#include&lt;/FONT&gt; &amp;lt;iostream&amp;gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; _tmain(&lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; argc, _TCHAR* argv[])&lt;BR&gt;{&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp; const&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;volatile&lt;/FONT&gt; &lt;FONT color=#0000ff&gt;int&lt;/FONT&gt; iTest = 1;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp; _asm&lt;BR&gt;&lt;/FONT&gt;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push 5&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop iTest&lt;BR&gt;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp; if&lt;/FONT&gt;(argc == iTest)&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; std::cout &amp;lt;&amp;lt; "equals!";&lt;BR&gt;&lt;FONT color=#0000ff&gt;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt; 0;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Compilato con VC++ 2003 il risultato &amp;#232; questo&lt;/STRONG&gt; (per maggiore chiarezza pubblico con il sorgente misto C++ e compilato x86):&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;const volatile int iTest = 1;&lt;BR&gt;00415D2E C7 45 F8 01 00 00 00 mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [iTest],1 &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;_asm&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;push 5&lt;BR&gt;00415D35 6A 05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;pop iTest&lt;BR&gt;00415D37 8F 45 F8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [iTest] &lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;nbsp;if(argc == iTest)&lt;BR&gt;00415D3A 83 7D 08 01&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [argc],1&lt;/FONT&gt;&amp;nbsp;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#008000&gt;// BUG! Ha sostituito iTest con 1 anche se &amp;#232; volatile&lt;BR&gt;&lt;/FONT&gt;00415D3E 75 12&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; main+42h (415D52h) &lt;BR&gt;&amp;nbsp;&amp;nbsp;std::cout &amp;lt;&amp;lt; "equals!";&lt;BR&gt;00415D40 68 C8 00 44 00&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset string "equals!" (4400C8h) &lt;BR&gt;00415D45 68 D8 92 44 00&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset std::cout (4492D8h) &lt;BR&gt;00415D4A E8 DA EB FF FF&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::operator&amp;lt;&amp;lt;&amp;lt;std::char_traits&amp;lt;char&amp;gt; &amp;gt; (414929h) &lt;BR&gt;00415D4F 83 C4 08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esp,8 &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;return 0;&lt;BR&gt;00415D52 33 C0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax,eax &lt;BR&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Compilato con VC++ 2005 il risultato &amp;#232; questo:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;const volatile int iTest = 1;&lt;BR&gt;0041140E C7 45 F8 01 00 00 00 mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [iTest],1 &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;_asm&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;push 5&lt;BR&gt;00411415 6A 05&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;pop iTest&lt;BR&gt;00411417 8F 45 F8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pop&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [iTest] &lt;BR&gt;&amp;nbsp;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;FONT size=2&gt;&amp;nbsp;if(argc == iTest)&lt;BR&gt;0041141A 8B 45 F8&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#ff0000&gt;mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax,dword ptr [iTest] &lt;BR&gt;&lt;/FONT&gt;0041141D 39 45 08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#ff0000&gt;cmp&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dword ptr [argc],eax&lt;/FONT&gt; &lt;BR&gt;00411420 75 13&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; jne&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wmain+45h (411435h) &lt;BR&gt;&amp;nbsp;&amp;nbsp;std::cout &amp;lt;&amp;lt; "equals!";&lt;BR&gt;00411422 68 FC 66 41 00&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset string "equals!" (4166FCh) &lt;BR&gt;00411427 A1 A8 92 41 00&amp;nbsp;&amp;nbsp; mov&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax,dword ptr [__imp_std::cout (4192A8h)] &lt;BR&gt;0041142C 50&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; push&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax&amp;nbsp; &lt;BR&gt;0041142D E8 FF FC FF FF&amp;nbsp;&amp;nbsp; call&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; std::operator&amp;lt;&amp;lt;&amp;lt;std::char_traits&amp;lt;char&amp;gt; &amp;gt; (411131h) &lt;BR&gt;00411432 83 C4 08&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; add&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; esp,8 &lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" size=2&gt;&amp;nbsp;return 0;&lt;BR&gt;00411435 33 C0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; xor&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eax,eax &lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;In sostanza VC++ 2003 ignora la keyword &lt;FONT color=#0000ff&gt;volatile&lt;/FONT&gt; e di conseguenza non &amp;#232; usabile pi&amp;#249; allo scopo.&lt;/P&gt;
&lt;P&gt;L'uso dell'inline assembler simula la presenza di un &amp;#8220;qualcosa&amp;#8220;&amp;nbsp;di esterno che modifichi la variabile. Al posto del blocco &lt;FONT color=#0000ff&gt;_asm&lt;/FONT&gt; ci sarebbe potuta essere una shared memory o qualsiasi altra cosa.&lt;/P&gt;
&lt;P&gt;Per dovere di cronaca va detto che questa ottimizzazione viene fatta sia in modalit&amp;#224; release che in debug (cio&amp;#232; con le ottimizzazioni 'spente').&amp;nbsp;Ci sono per&amp;#242; tante&amp;nbsp;ottimizzazioni pi&amp;#249; spinte che vegnono effettuate solo in modalit&amp;#224; release e per questo &amp;#232; sempre indispensabile fare i test anche sulla versione release.&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/24364.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2005/07/26/24364.aspx</guid>
            <pubDate>Tue, 26 Jul 2005 15:31:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/24364.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2005/07/26/24364.aspx#feedback</comments>
            <slash:comments>30</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/24364.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/24364.aspx</trackback:ping>
        </item>
        <item>
            <title>Visual C++ in primo piano con VS2005</title>
            <link>http://blogs.ugidotnet.org/raffaele/archive/2005/05/12/16167.aspx</link>
            <description>&lt;P&gt;Con molto affanno torno sul VC++ Day ...&amp;nbsp;le due giornate passate con &lt;A href="http://blogs.msdn.com/aprilr/"&gt;April&lt;/A&gt;, Ronald e &lt;A href="http://blogs.msdn.com/nikolad/"&gt;Nikola&lt;/A&gt; sono state entusiasmanti.&lt;/P&gt;
&lt;P&gt;Non ho memoria di un evento su VC++ e se c'erano voci che il C++ stesse per andare in cantina, all'evento sono state smentite con i fatti. Circa 140 persone, 55 tester e 16 PM si occupano di questo gioiello che serve a sviluppare il 95% del codice prodotto da Microsoft.&lt;/P&gt;
&lt;P&gt;Riassumere tutto sarebbe veramente lunghissimo e quindi mi terr&amp;#242; argomenti per futuri blog, dopo aver approfondito i singoli punti, per&amp;#242; alcune cose mi fa piacere ricordarle:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Adeguamento allo standard ISO. Questo &amp;#232; un punto importante perch&amp;#232; permette di mettere al sicuro il nostro codice sorgente. Spesso i sorgenti VC++ sono algoritmi privi di interfaccia grafica che possono veramente sopravvivere a lungo, a priori del sistema operativo o delle tecnologie che li circondano. Usare un compilatore standard significa che con le future versioni non ci saranno sorprese nel compilare il nostro codice.&lt;BR&gt;Spesso questo punto mette in crisi chi migra da VC++ 6.0 che non era affatto aderente allo standard, ma tra le altre cose si guadagna la possibilit&amp;#224; di usare librerie note come Boost e Loki.&lt;BR&gt;
&lt;LI&gt;Ottimizzazioni. Solo ricompilando il codice con le nuove ottimizzazioni si guadagna in performance fino al 30% rispetto a VC++ 6.0 e cifre simili anche da VC++ 2003 ... per una ricompilata non &amp;#232; male :-)&lt;BR&gt;Le ottimizzazioni ora tengono conto dell'intero codice e non sono pi&amp;#249; applicate solo sui singoli file obj.&lt;BR&gt;
&lt;LI&gt;Supporto del compilatore per la compilazione parallela su pi&amp;#249; CPU o su pi&amp;#249; Core in una singola CPU&lt;BR&gt;
&lt;LI&gt;Supporto del compilatore alle specifiche OpenMP di cui avevo visto una demo della Intel allo scorso TechEd. In pratica con&amp;nbsp;la direttiva:&lt;BR&gt;#pragma omp parallel for&lt;BR&gt;for(int i=0; i&amp;lt;=n; ++i) {a[i] = b[i] + c[i]&amp;nbsp;}&lt;BR&gt;si ottimizza l'esecuzione del loop su pi&amp;#249; thread contemporaneamente.&lt;BR&gt;
&lt;LI&gt;Profilazione statica del codice. Questa analisi permette di ottimizzare il codice sulla base di un run di prova. Si lancia l'applicazione in una modalit&amp;#224; particolare usando le sole funzionalit&amp;#224; critiche, quelle per cui vogliamo il massimo della performance. I dati collezionati da questa modalit&amp;#224; vengono poi usati dal compilatore per ottimizzare la compilazione vera e propria.&lt;BR&gt;
&lt;LI&gt;Sempre una profilazione statica del codice permette l'individuazione di potenziali problemi, vulnerabilit&amp;#224;, etc. suggerendo se possibile la fix da adottare.&lt;BR&gt;
&lt;LI&gt;Supporto del compilatore managed e unmanaged per la compilazione a 64bit&lt;BR&gt;
&lt;LI&gt;Side-by-side libraries del CRT (e non solo) per evitare il pi&amp;#249; che noto DLL Hell&lt;BR&gt;
&lt;LI&gt;Supporto all'attach del debugger a pi&amp;#249; processi oltre che a pi&amp;#249; thread come gi&amp;#224; fattibile in VS.NET 2003&lt;BR&gt;
&lt;LI&gt;Unico ambiente di sviluppo sia per la piattaforma Full che quella embedded&lt;BR&gt;
&lt;LI&gt;Secure version delle librerie CRT (tanto per intenderci quelle usate per la XP SP2 e Win2K3 SP1). Il codice va rivisto ma con queste librerie si evitano i buffer overrun e quindi ne vale la pena.&amp;nbsp;In molti casi non &amp;#232; necessario modificare nulla grazie ad una speciale versione templated delle funzioni che permette di 'dedurre'&amp;nbsp; la dimensione del buffer se questa viene allocata nello stack locale.&lt;BR&gt;
&lt;LI&gt;Nuova sintassi C++/CLI in fase di standardizzazione ECMA ed ISO. Il nuovo standard &amp;#232; molto pi&amp;#249; semplice da usare e permette di usare con semplicit&amp;#224; le facilities di una piattaforma costruita sulla Common Language Infrastructure (standard ECMA). Grazie alla riga di comando /CLR si compila secondo la nuova sintassi.&lt;BR&gt;Per chi ha usato le managed extensions, sar&amp;#224; disponibile un tool di conversione automatizzata che lo stesso Stan Lippman ci ha mostrato lo scorso Aprile a Redmond.&lt;BR&gt;
&lt;LI&gt;Linker di VC++ potr&amp;#224; costruire immagini miste (file come le dll) con codice managed (generato non solo da C++/CLI ma anche da C# o altri linguaggi) ed unmanaged. Questo pu&amp;#242; tornare utile a tutti coloro che volessero linkare in un unico assembly da VS.NET codice IL sviluppato in linguaggi diversi.&lt;BR&gt;
&lt;LI&gt;Deterministic Finalization. In pratica il distruttore delle classi C++ non &amp;#232; mappato come in C# sulla Finalize ma sulla Dispose. Questo consente l'implementazione automatica del pattern Dispose risparmiando non pochi grattacapi vista la complessit&amp;#224; di quel pattern.&lt;BR&gt;
&lt;LI&gt;Possibilit&amp;#224; di inserire le Winform (ed in futuro Avalon) in progetti MFC o WTL, grazie alla creazione di immagini miste managed/unmanaged. Per esempio MFC pu&amp;#242; usere le winform al posto di una classica CView senza perdere il routing dei messaggi, etc..&lt;BR&gt;
&lt;LI&gt;... sicuramente me ne sto dimenticando molte altre ...&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Tutto questo per non parlare dell'IDE che fa veramente invidia anche a C#.... more to come ...&lt;/P&gt;&lt;img src="http://blogs.ugidotnet.org/raffaele/aggbug/16167.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Raffaele Rialdi</dc:creator>
            <guid>http://blogs.ugidotnet.org/raffaele/archive/2005/05/12/16167.aspx</guid>
            <pubDate>Thu, 12 May 2005 20:04:00 GMT</pubDate>
            <wfw:comment>http://blogs.ugidotnet.org/raffaele/comments/16167.aspx</wfw:comment>
            <comments>http://blogs.ugidotnet.org/raffaele/archive/2005/05/12/16167.aspx#feedback</comments>
            <slash:comments>8</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/raffaele/comments/commentRss/16167.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/raffaele/services/trackbacks/16167.aspx</trackback:ping>
        </item>
    </channel>
</rss>
