C++ und assembler
-
class A { public: int irgendwasA; }; class B { public: int irgendwasB; void TuWas(); }; A theA; void B::TuWas() { __asm { mov eax, this mov ebx, [ eax + irgendwasB ] // klappt mit MS VC++ mov ebx, [ eax + B::irgendwasB ] // geht auch und besser lesbar // (es könnte ja noch mehr irgendwasB in anderen // namespaces geben) /* Intel C+ streikt mit beiden anweisungen, für ihn geht: mov abx, [ eax + B.irgendwasB ] das klappt aber nicht mit MS VC++; also kann man folgendes tun: */ #if INTEL_COMPILER > 0 #define asm_B_irgendwasB B.irgendwasB #else #define asm_B_irgendwasB B::irgendwasB #endif mov ebx, [ eax + asm_B_irgendwasB ] // das ist nicht unbedingt bequem, aber sicher // aber: mov eax, offset theA mov ebx, [ eax + A::irgendwasA ] // mit MS VC++ // aber NICHT - mit Intel C++ // mov ebx, [ eax + A.irgendwasA ] // offenbar kann diese Notation nur verwendet werden, wenn irgendwasA // sowieso schon im scope der funtion liegt } } /* man kann höchtens noch - in der declaration, einfügen: class A { int irgendwasA; #define asm_A_irgendwasA 0 }; der große nachteil ist, dass man die offsets hier genau kennen muss, falls A eine abgeleitet klasse ist, verändert sich der offset nat. auch, wenn die basisklasse verändert wird - das ist kaum praktikabel wenn mehrere entwickler beteiligt sind; im falle des aufrufs von virtuellen funktionen kommt man allerdings sowieso nicht drum herum */
also: wenn jemand eine methode kennt, die auch für Intel C++ funktioniert, bitte hier posten