एक ही कोड का उपयोग करते समय, बस कंपाइलर (C कंपाइलर से C ++ कंपाइलर तक) को बदलने से मेमोरी कितनी आवंटित होती है, बदल जाएगी। मुझे यकीन नहीं है कि यह क्यों है और इसे और अधिक समझना चाहते हैं। अब तक मुझे जो सबसे अच्छी प्रतिक्रिया मिली है, वह है "शायद I / O स्ट्रीम", जो बहुत वर्णनात्मक नहीं है और मुझे C ++ के "पहलू जो आप उपयोग नहीं करते हैं, उसके बारे में आपको आश्चर्य नहीं है"।
मैं क्रमशः Clang और GCC कंपाइलर, संस्करण 7.0.1-8 और 8.3.0-6 का उपयोग कर रहा हूं। मेरा सिस्टम डेबियन 10 (बस्टर), नवीनतम पर चल रहा है। बेंचमार्क Valgrind Massif के माध्यम से किया जाता है।
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
उपयोग किया गया कोड परिवर्तित नहीं होता है, लेकिन मैं C या C ++ के रूप में संकलित करता हूं, तो यह Valgrind मानदंड के परिणामों को बदल देता है। हालाँकि, मान कंपाइलर के अनुरूप होते हैं। कार्यक्रम के लिए रनटाइम आबंटन (शिखर) निम्नानुसार है:
- जीसीसी (C): 1,032 बाइट्स (1 KB)
- G ++ (C ++): 73,744 बाइट्स, (~ 74 KB)
- क्लैंग (C): 1,032 बाइट्स (1 KB)
- क्लैंग ++ (C ++): 73,744 बाइट्स (~ 74 KB)
संकलन के लिए, मैं निम्नलिखित आदेशों का उपयोग करता हूं:
clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp
Valgrind के लिए, मैं valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
प्रत्येक संकलक और भाषा पर चलता हूं , फिर ms_print
चोटियों को प्रदर्शित करने के लिए।
क्या मुझसे यहां कुछ गलत हो रहा है?
try
एक बड़ी मेमोरी फुटप्रिंट की कीमत पर एक ब्लॉक में प्रवेश करने के लिए कोई प्रदर्शन हिट नहीं होता है , शायद एक जंप टेबल या कुछ और के साथ। शायद अपवादों के बिना संकलन करने की कोशिश करें और देखें कि क्या प्रभाव पड़ता है। संपादित करें: वास्तव में, iteratively विभिन्न सी ++ सुविधाओं को अक्षम करने की कोशिश करते हैं कि मेमोरी फुटप्रिंट पर क्या प्रभाव पड़ता है।
clang++ -xc
इसके बजाय के साथ संकलित किया clang
गया था, तो वही आवंटन था, जो लिंक किए गए पुस्तकालयों के कारण दृढ़ता से सुझाव देता है
C
मोड में बाइट्स की सटीक संख्या और बाइट्स C++
मोड की सटीक समान संख्या उत्पन्न करते हैं । क्या आपने एक प्रतिलेखन त्रुटि की?