क्या कोई तरीका — gcc -E
— के साथ प्रीप्रोकैसिंग के परिणाम को देखने जैसा है, यह देखने के लिए कि ऑब्जेक्ट फ़ाइलों में संकलित एक बार कैसा दिखता है?संकलित वस्तुओं का लेआउट
मैं जीसीसी के बारे में बात कर रहा हूं, लेकिन एमएसवीसी समेत एक समाधान ठीक होगा।
क्या कोई तरीका — gcc -E
— के साथ प्रीप्रोकैसिंग के परिणाम को देखने जैसा है, यह देखने के लिए कि ऑब्जेक्ट फ़ाइलों में संकलित एक बार कैसा दिखता है?संकलित वस्तुओं का लेआउट
मैं जीसीसी के बारे में बात कर रहा हूं, लेकिन एमएसवीसी समेत एक समाधान ठीक होगा।
ऑब्जेक्ट फाइलों में द्विआधारी डेटा होता है - एकमात्र उच्च स्तर जो अधिकांश कंपाइलर आउटपुट कर सकते हैं, असेंबलर है, इसलिए यदि आप यह नहीं पढ़ सकते कि आप भाग्य से बाहर हैं। हालांकि, इस क्षेत्र में अधिक जानकारी के लिए this question पर एक नज़र डालें।
आप नक्शा फ़ाइलों का उपयोग कर द्विआधारी और उनकी सामग्री के लेआउट का निरीक्षण कर सकते हैं। जीसी के लिए वीसी और -Map
या --print-map
के लिए /MAP
का उपयोग करें।
आपका प्रश्न थोड़ा उलझन में है।
यदि आप एमएसवीसी के साथ प्रीप्रोकैसिंग के परिणाम देखना चाहते हैं, तो आप /E
, /P/
, या /EP
का उपयोग कर सकते हैं।
संरचनाओं और कक्षाओं के डेटा लेआउट को दिखाने के लिए एमएसवीसी में एक अनियंत्रित विकल्प है। मुझे अभी यह ढूंढने में परेशानी हो रही है।
> संरचनाओं और कक्षाओं के डेटा लेआउट को दिखाने के लिए एमएसवीसी में एक अनियंत्रित विकल्प है। मुझे अभी यह ढूंढने में परेशानी हो रही है। यह वही है जो मैं ढूंढ रहा हूं! – user257620
मैं अंत में उन स्विच को खोदने में कामयाब रहा: '/ d1reportSingleClassLayoutXXX' और'/d1reportAllClassLayout'। –
जीसीसी संकलित निष्पादन योग्य के लिए, चेकआउट Pahole। यह आपको दिखाएगा कि कंपाइलर ने आपके structs/वर्गों को कैसे रखा और चाहे उनके पास "छेद" हो या नहीं। मेमोरी संरेखण नियमों के कारण छेद पैडिंग हैं।
(+1) नाइस टूल –
पैहोल लिंक मर चुका है – ofloveandhate
@ofloveandhate मैंने लिंक तय किया। – paxos1977
एक कन्स्ट्रक्टर सिर्फ एक और कार्य है (जब तक कि यह रेखांकित न हो)। ऑब्जेक्ट फ़ाइलों में लिंकर के लिए बहुत सारी जानकारी होती है; इसलिए आपको .a फ़ाइल में फ़ंक्शन ढूंढने में सक्षम होना चाहिए (फ़ंक्शन नाम यद्यपि उलझाए जाएंगे)।
आप कोड या डेटा का मतलब क्या (वर्ग के नाम के साथ
XXX
की जगह)? –अच्छा बिंदु जॉन। कन्स्ट्रक्टर कोड होगा, और सभी कोड वर्ग से संबंधित हैं, व्यक्तिगत वस्तुओं नहीं। इसलिए आपको ऑब्जेक्ट लेआउट में नहीं मिलेगा। – MSalters
'file.s' में असेंबलर आउटपुट प्राप्त करने के लिए आप' g ++ -S file.cpp' का उपयोग कर सकते हैं। क्या ये वही है जो तुम चाहते हो? – msandiford