Zeiger auf virtuelle Klassenmethode in VS C++ 2008 EE
-
Hallo,
soweit ich mein Problem richtig recherchiert habe, müsste
das die richtige Rubrik sein.Ich habe einen Zeiger für diverse virtuelle Klassenmethoden.
Für die Aufrufe, die "echt" virtuell sind,
gibt mir der VS Compiler eine Warnung aus.warning 4793: vcall{#}, Code muss als systemeigen kompiliert werden.
irgendwas mit vcall-thunks und clrcall(Sorry, für die geringe Präzision, aber ich schreib das hier im Internet-Cafe
und erinner mich nicht 100% an die Ausgabe)Nun habe ich in der Hilfe des Compilers und im Internet herausgefunden,
dass es was mit der Common Language Runtime zu tun hat,
die - soweit meine ich das verstanden zu haben - die
Systemportabilität unterstützen soll.Was mir aber nun nach langer Suche nicht klar ist,
wie ich mit dieser Warnung verfahren soll...
Gibt es eine Möglichkeit, dieses Warnung im Sinne der CLR
zu behandeln oder soll ich sie einfach ignorieren.Vielen Dank
Rahul0891
-
http://msdn.microsoft.com/en-us/library/dby9t00y.aspx
Zeig mal deinen Code.
Bist Du dir sicher, dass Du /clr brauchst?Simon
-
Danke für die Antwort,
habe zwar die Warnung schon in meiner offline MSDN-Library nachgeschaut,
aber nicht weiterverfolgt, weil ich erst mit diesem CLR-Thema
überfordert war und erst mehr Informationen gebraucht habe.Jetzt hast du mich noch mal draufhingewiesen und ich habe
einfach nen Makro implementiert:#ifndef _MANAGED #define CLR_CALL #else #define CLR_CALL __clrcall #endif
und vor allen Klassenmethoden, die eventuell über direkt Zeiger aufgerufen werden, ein CLR_CALL geknallt, nur nicht vor Konstruktor, Destruktor
und Kopierkonstruktor...(ist das in Ordnung?)Ich weiß nicht, ob ich CLR brauche.
Ich denke nicht, da es ja mehrere Sprachen zusammenführen soll,
ich aber nur in C++ programmiere.Aber es war in VS C++ als Standardeinstellung und auch sonst hielt ich
es im Netz für so eine Art Standard, wo man zumindest mal hinwill.
Und da fand ich es ne gute Idee, zumindest mal zu fragen,
wie es zu berücksichtigen ist.:DAlles Gute
Roman
-
Wenn DU die CLR (.NET) nicht brauchst, dann deaktiviere es bitte!
Es macht auch in den seltensten Fällen Sinn, dass man für das gesamte Projekt /clr aktiviert.Die Warnung bedeutet eigentlich: Achtung: Aus Deinem Code wird hier natvie Code erzeugt, obwohl der rest des Codes nach IL (CLR) übersetzt wurde. Dies bedeutet für Dich, dass beim Aufruf dieser Methode ein "InterOp"-Aufruf durchgeführt wird und dadurch massiver Zwischencode zur Laufzeit eingefügt wird.
Für ein kleines Beispiel, siehe:
http://blog.kalmbach-software.de/2009/05/12/ccli-quiz-answer/
-
Hmm, aber hier steht
MSDN Library Suche: __clrcall
Specifies that a function can only be called from managed code.
Use __clrcall for all virtual functions that will only be called from managed code.
However this calling convention cannot be used for functions that will be called from native code.Use __clrcall to improve performance when calling from a managed function
to a virtual managed function or from managed function to managed function through pointer.Entry points are separate, compiler-generated functions.
If a function has both native and managed entry points,
one of them will be the actual function with the function implementation.
The other function will be a separate function (a thunk) that calls into the actual function
and lets the common language runtime perform PInvoke.
When marking a function as __clrcall, you indicate the function implementation must be MSIL
and that the native entry point function will not be generated.Also, ich verstehe das so, dass ich mit __clrcall den "managed entry" erzwinge
und damit die Leistungsabfall, den du in deinem Blog ansprichst, zumindest teilweise abbaue.
Irgendwo habe ich gelesen, dass die Übersetzung in CIL/MSIL immer mit
(meistens geringen) Leistungsverlusten einhergeht,
das mit Hinblick auf Portabilität aber in Kauf genommen wird.Ich wollte jetzt so programmieren, dass ich zwischen beiden hin- und herschalten kann,
wie in dem Makro angedeutet. Halte ich nicht unbedingt für ne schlechte IdeeFalls noch jemand seinen Senf dazugeben will, immer her damit,
ich lern gern dazu.Alles Gute
Rahul