J'ai besoin de savoir si, lorsqu'une méthode de classe en C ++ est appelée, le pointeur implicite "Ce" pointeur est le premier argument ou le dernier. IE: si elle est poussée sur la pile d'abord ou en dernier.
En d'autres termes, je demande si une méthode de classe, appelée, est prise par le compilateur pour être: p> par extension par conséquent, et plus important encore, cela répondrait également si g ++ pousserait le dernier ou le premier point, respectivement. J'ai interrogé Google, mais je n'ai pas beaucoup trouvé. P> et comme une note latérale, lorsque les fonctions C ++ sont appelées, font-elles la même chose que c fonctionne? c.-à-don: p> Tout dans tout: une méthode de classe serait-elle appelée ressemblant à ceci? p> merci, et beaucoup Obligé. P> Edit: Pour clarifier les choses, j'utilise GCC / G ++ 4.3 P> P>
4 Réponses :
Cela dépend de la convention appelante de votre compilateur et de l'architecture cible. P>
Par défaut, Visual C ++ ne poussera pas ceci sur la pile. Pour X86, le compilateur sera par défaut de «CeciCall» appelant Convention et passera cela dans le registre EXC. Si vous spécifiez __STDCALL pour votre fonction membre, il sera repoussé sur la pile comme premier paramètre. p>
Pour X64 sur VC ++, les quatre premiers paramètres sont transmis dans des registres. Ceci est le premier paramètre et transmis dans le registre RCX. P>
Raymond Chen avait une série il y a quelques années sur des conventions appelantes. Voici le x86 et x64 articles. P>
Merci. L'article de Raymond Chen a effacé pour moi. Tous mes vœux.
Ce type de détail n'est pas spécifié par la norme C ++. Cependant, lisez via le C ++ ABI pour GCC (et d'autres compilateurs C ++ qui suivent la C ++ ABI). P>
Cela dépendra de votre compilateur et de votre architecture, mais dans g ++ 4.1.2 sur Linux sans paramètres d'optimisation, il traite ce code> comme premier paramètre, passé dans un registre:
movl $0, 8(%esp)
movl $0, 4(%esp)
leal -5(%ebp), %eax
movl %eax, (%esp)
call _Z5HelloP1Aii
movl $0, 8(%esp)
movl $0, 4(%esp)
leal -5(%ebp), %eax
movl %eax, (%esp)
call _ZN1A5HelloEii
Merci. C'était extrêmement utile aussi.
Je viens de lire la norme C ++ (ANSI ISO CEI 14882 2003), section 9.3.2 "Le ce pointeur", et il ne semble pas spécifier quoi que ce soit sur l'endroit où il devrait se produire dans la liste des arguments, de sorte que C'est au compilateur individuel. P>
Essayez de compiler du code avec GCC à l'aide du drapeau '-S' pour générer du code de montage et jetez un coup d'œil à ce que c'est faire. P>
Il ne précise même pas si les arguments vont sur la pile du tout ou même s'il y a une pile.
Cela aurait été plus rapide pour vous de ne pas poser cette question et de regarder l'assemblage généré par votre compilateur. Ils ont tous des commutateurs à la sortie du code de montage comme texte.