2009-08-18 10 views
6

पर कैसे धक्का दिया जाता है, मुझे यह जानने की ज़रूरत है कि, जब सी ++ में कक्षा विधि कहलाती है, तो निहित 'यह' सूचक पहला तर्क है, या अंतिम। यानी: क्या इसे पहले या आखिरी स्टैक पर धक्का दिया जाता है।सी ++ इसे निहित करता है, और वास्तव में इसे स्टैक

दूसरे शब्दों में, मैं पूछ रहा हूँ कि क्या एक वर्ग विधि, बुलाया जा रहा है, संकलक द्वारा लिया जाता है होना करने के लिए:

int foo::bar(foo *const this, int arg1, int arg2); 
//or: 
int foo::bar(int arg1, int arg2, foo *const this); 

विस्तार करने पर इसलिए, और अधिक महत्वपूर्ण बात यह है कि यह भी कि क्या जी का जवाब होगा ++ होगा क्रमशः अंतिम या पहले इस सूचक को धक्का दें। मैंने Google से पूछताछ की, लेकिन मुझे ज्यादा नहीं मिला।

और एक साइड नोट के रूप में, जब सी ++ फ़ंक्शन कहा जाता है, तो क्या वे सी फ़ंक्शंस के समान काम करते हैं? i.e:

push ebp 
mov ebp, esp 

सभी में: क्या एक वर्ग विधि को इस तरह दिखने वाला कहा जाएगा?

; About to call foo::bar. 
push dword 0xDEADBEEF 
push dword 0x2BADBABE 
push dword 0x2454ABCD ; This one is the this ptr for the example. 
; this code example would match up if the this ptr is the first argument. 
call _ZN3foo3barEpjj 

धन्यवाद, और बहुत अधिक बाध्य।

संपादित करें: बातें, मैं उपयोग कर रहा हूँ जीसीसी/जी ++ 4.3

+0

आपके लिए यह प्रश्न पूछने के लिए तेज़ी से और आपके कंपाइलर द्वारा उत्पन्न असेंबली को देखें। वे सभी पाठ के रूप में आउटपुट असेंबली कोड स्विच करने के लिए स्विच कर दिया है। –

उत्तर

15

यह आपके संकलक की बुला सम्मेलन और लक्ष्य वास्तुकला पर निर्भर करता है स्पष्ट करने के लिए।

डिफ़ॉल्ट रूप से, दृश्य C++ इसे स्टैक पर धक्का नहीं देगा। X86 के लिए, कंपाइलर "इसकॉल" कॉलिंग सम्मेलन के लिए डिफ़ॉल्ट होगा और इसे ecx रजिस्टर में पास कर देगा। यदि आप सदस्य सदस्य फ़ंक्शन के लिए __stdcall निर्दिष्ट करते हैं, तो इसे पहले पैरामीटर के रूप में स्टैक पर धक्का दिया जाएगा।

वीसी ++ पर x64 के लिए, पहले चार पैरामीटर रजिस्टरों में पास किए जाते हैं। यह पहला पैरामीटर है और आरसीएक्स रजिस्टर में पारित किया गया है।

रेमंड चेन ने कुछ साल पहले सम्मेलन बुलाए जाने पर एक श्रृंखला की थी। यहां x86 और x64 लेख हैं।

+0

http://en.wikipedia.org/wiki/X86_calling_conventions – Havenard

+0

धन्यवाद। रेमंड चेन के लेख ने इसे मेरे लिए साफ़ कर दिया। शुभकामनाएं। –

1

इस प्रकार का विवरण सी ++ मानक द्वारा निर्दिष्ट नहीं है। हालांकि, जीसीसी (और अन्य सी ++ कंपाइलर्स जो सी ++ एबीआई का पालन करते हैं) के लिए C++ ABI के माध्यम से पढ़ें।

8

यह कोई अनुकूलन सेटिंग, यह पहली पैरामीटर के रूप में व्यवहार करता है this एक रजिस्टर में पारित साथ लिनक्स पर अपने संकलक और स्थापत्य कला पर निर्भर करेगा, लेकिन जी में ++ 4.1.2:

class A 
{ 
public: 
    void Hello(int, int) {} 
}; 

void Hello(A *a, int, int) {} 

int main() 
{ 
    A a; 
    Hello(&a, 0, 0); 
    a.Hello(0, 0); 
    return 0; 
} 

मुख्य की Disassembly() :

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 
+0

धन्यवाद।यह भी बहुत मददगार था। –

2

मैं सिर्फ सी ++ मानक का रीड खंड 9.3.2 "इस सूचक" था (एएनएसआई आईएसओ आईईसी 14882 2003), है, और यह है, जहां यह में होने चाहिए के बारे में कुछ भी निर्दिष्ट करने के लिए प्रतीत नहीं होता तर्कों की सूची, इसलिए यह व्यक्तिगत कंपाइलर पर निर्भर है।

असेंबली कोड उत्पन्न करने के लिए '-S' ध्वज का उपयोग करके जीसीसी के साथ कुछ कोड संकलित करने का प्रयास करें और यह देखें कि यह क्या कर रहा है।

+2

यह यह भी निर्दिष्ट नहीं करता है कि क्या तर्क स्टैक पर जाते हैं, या यहां तक ​​कि यदि कोई स्टैक है। – MSalters

संबंधित मुद्दे