संक्षिप्त उत्तर है, C द्वारा समर्थित अधिकांश भाषा निर्माण भी लक्ष्य कंप्यूटर के माइक्रोप्रोसेसर द्वारा समर्थित हैं, इसलिए, संकलित C कोड माइक्रोप्रोसेसर की असेंबली भाषा में बहुत अच्छी तरह से और कुशल अनुवाद करता है, जिसके परिणामस्वरूप छोटे कोड और एक छोटे पदचिह्न होते हैं।
लंबे उत्तर के लिए थोड़ी सी असेंबली भाषा ज्ञान की आवश्यकता होती है। सी में, इस तरह के एक बयान:
int myInt = 10;
विधानसभा में इस तरह से अनुवाद करना होगा:
myInt dw 1
mov myInt,10
इसकी तुलना C ++ जैसी किसी चीज़ से करें:
MyClass myClass;
myClass.set_myInt(10);
परिणामी असेंबली लैंग्वेज कोड (यह निर्भर करता है कि MyClass () कितना बड़ा है), सैकड़ों असेंबली लैंग्वेज लाइन्स को जोड़ सकता है।
वास्तव में असेंबली भाषा में कार्यक्रम बनाने के बिना, शुद्ध सी शायद "स्किनएनेस्ट" और "सबसे मजबूत" कोड है जिसे आप एक कार्यक्रम बना सकते हैं।
संपादित करें
मेरे जवाब पर टिप्पणियों को देखते हुए, मैंने एक परीक्षण चलाने का फैसला किया, सिर्फ अपनी पवित्रता के लिए। मैंने "test.c" नामक एक कार्यक्रम बनाया, जो इस तरह दिखता था:
#include <stdio.h>
void main()
{
int myInt=10;
printf("%d\n", myInt);
}
मैंने इसे gcc का उपयोग करके असेंबली के लिए संकलित किया। इसे संकलित करने के लिए मैंने निम्न कमांड लाइन का उपयोग किया:
gcc -S -O2 test.c
यहाँ परिणामस्वरूप विधानसभा भाषा है:
.file "test.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "%d\n"
.section .text.unlikely,"ax",@progbits
.LCOLDB1:
.section .text.startup,"ax",@progbits
.LHOTB1:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB24:
.cfi_startproc
movl $10, %edx
movl $.LC0, %esi
movl $1, %edi
xorl %eax, %eax
jmp __printf_chk
.cfi_endproc
.LFE24:
.size main, .-main
.section .text.unlikely
.LCOLDE1:
.section .text.startup
.LHOTE1:
.ident "GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
.section .note.GNU-stack,"",@progbits
मैं फिर "test.cpp" नामक एक फाइल बनाता हूं, जिसने एक वर्ग को परिभाषित किया और "test.c" जैसी ही चीज़ को आउटपुट किया।
#include <iostream>
using namespace std;
class MyClass {
int myVar;
public:
void set_myVar(int);
int get_myVar(void);
};
void MyClass::set_myVar(int val)
{
myVar = val;
}
int MyClass::get_myVar(void)
{
return myVar;
}
int main()
{
MyClass myClass;
myClass.set_myVar(10);
cout << myClass.get_myVar() << endl;
return 0;
}
मैंने इसे इसी तरह संकलित किया, इस कमांड का उपयोग करते हुए:
g++ -O2 -S test.cpp
यहाँ परिणामस्वरूप विधानसभा फ़ाइल है:
.file "test.cpp"
.section .text.unlikely,"ax",@progbits
.align 2
.LCOLDB0:
.text
.LHOTB0:
.align 2
.p2align 4,,15
.globl _ZN7MyClass9set_myVarEi
.type _ZN7MyClass9set_myVarEi, @function
_ZN7MyClass9set_myVarEi:
.LFB1047:
.cfi_startproc
movl %esi, (%rdi)
ret
.cfi_endproc
.LFE1047:
.size _ZN7MyClass9set_myVarEi, .-_ZN7MyClass9set_myVarEi
.section .text.unlikely
.LCOLDE0:
.text
.LHOTE0:
.section .text.unlikely
.align 2
.LCOLDB1:
.text
.LHOTB1:
.align 2
.p2align 4,,15
.globl _ZN7MyClass9get_myVarEv
.type _ZN7MyClass9get_myVarEv, @function
_ZN7MyClass9get_myVarEv:
.LFB1048:
.cfi_startproc
movl (%rdi), %eax
ret
.cfi_endproc
.LFE1048:
.size _ZN7MyClass9get_myVarEv, .-_ZN7MyClass9get_myVarEv
.section .text.unlikely
.LCOLDE1:
.text
.LHOTE1:
.section .text.unlikely
.LCOLDB2:
.section .text.startup,"ax",@progbits
.LHOTB2:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB1049:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $10, %esi
movl $_ZSt4cout, %edi
call _ZNSolsEi
movq %rax, %rdi
call _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
xorl %eax, %eax
addq $8, %rsp
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE1049:
.size main, .-main
.section .text.unlikely
.LCOLDE2:
.section .text.startup
.LHOTE2:
.section .text.unlikely
.LCOLDB3:
.section .text.startup
.LHOTB3:
.p2align 4,,15
.type _GLOBAL__sub_I__ZN7MyClass9set_myVarEi, @function
_GLOBAL__sub_I__ZN7MyClass9set_myVarEi:
.LFB1056:
.cfi_startproc
subq $8, %rsp
.cfi_def_cfa_offset 16
movl $_ZStL8__ioinit, %edi
call _ZNSt8ios_base4InitC1Ev
movl $__dso_handle, %edx
movl $_ZStL8__ioinit, %esi
movl $_ZNSt8ios_base4InitD1Ev, %edi
addq $8, %rsp
.cfi_def_cfa_offset 8
jmp __cxa_atexit
.cfi_endproc
.LFE1056:
.size _GLOBAL__sub_I__ZN7MyClass9set_myVarEi, .-_GLOBAL__sub_I__ZN7MyClass9set_myVarEi
.section .text.unlikely
.LCOLDE3:
.section .text.startup
.LHOTE3:
.section .init_array,"aw"
.align 8
.quad _GLOBAL__sub_I__ZN7MyClass9set_myVarEi
.local _ZStL8__ioinit
.comm _ZStL8__ioinit,1,1
.hidden __dso_handle
.ident "GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
.section .note.GNU-stack,"",@progbits
जैसा कि आप स्पष्ट रूप से देख सकते हैं, परिणामस्वरूप असेंबली फ़ाइल C ++ फ़ाइल पर बहुत बड़ी है तो यह C फ़ाइल पर है। यहां तक कि अगर आप अन्य सभी सामानों को काटते हैं और केवल C "मुख्य" की तुलना C ++ "मुख्य" से करते हैं, तो बहुत अधिक अतिरिक्त सामान होता है।