मैं 32-bit x86
आर्किटेक्चर पर बाइनरी की ओर कुछ रिवर्स इंजीनियरिंग कार्य कर रहा हूं।मेमोरी आवंटन अनुकूलन: ढेर से ढेर
हाल ही में मुझे C
स्रोत कोड से असेंबली प्रोग्राम में कुछ रोचक अनुकूलन मिले।
उदाहरण के लिए, मूल स्रोत कोड की तरह (इस स्रोत कोड openssl library
से है):
807eaa0: cmp eax, 0xbff # eax holds the length of the buf.
807eaa5: mov dword ptr [ebp-0x68], eax # store the length of powerbuf on the stack
807eaa8: jnle 0x807ec60 # 0x807ec60 refers to the malloc
807eaae: mov edx, eax
807eab0: add eax, 0x5e
807eab3: and eax, 0xfffffff0
807eab6: sub esp, eax
807eab8: lea eax, ptr [esp+0x23]
807eabc: and eax, 0xffffffc0
807eabf: add eax, 0x40
807ead3: mov dword ptr [ebp-0x60], eax # store the base addr of the buf on the stack.
:
powerbufFree = (unsigned char *)malloc(powerbufLen);
और संकलन (gcc version 4.8.4 -O3
) के बाद, विधानसभा कोड इस तरह है मेरे आश्चर्य करने के लिए, buf वास्तव में ढेर पर आवंटित किया जाता है !!! यह मेरे लिए ढेर संभाजक के लिए एक अनुकूलन की तरह लगता है, लेकिन मुझे यकीन है कि नहीं हूँ।
तो मेरा प्रश्न यह है कि क्या उपर्युक्त अनुकूलन (मॉलोक -> स्टैक आवंटन) किसी के लिए familar लगता है? क्या इस का कोई मतलब निकलता है? क्या कोई इस तरह के अनुकूलन पर कुछ मैनुअल/विनिर्देश प्रदान कर सकता है?
मॉलोक कॉल कहां है? \ –
यह मुझे नए जेवीएम में एस्केप विश्लेषण का बहुत याद दिलाता है। https://en.wikipedia.org/wiki/Escape_analysis यदि स्मृति फ़ंक्शन कॉल के बाहर कभी नहीं रहती है, तो इसे सुरक्षित रूप से स्टैक से आवंटित किया जा सकता है। यदि आपके पास अपने ढेर में जगह है तो यह ऑपरेशन की एक बहुत तेज़ आवंटन/मुक्त जोड़ी होगी। – Sam
मुझे लगता है कि ढेर एक सामान्य वृक्ष संरचना है। गहराई की खोज विधि के साथ ढेर को घुमाने के द्वारा, तत्वों को एक ढेर के क्रम से अनुक्रम में देखा गया। –