निम्नलिखित कार्यक्रम पर विचार करें:क्या कंपाइलर स्थानीय चरों को पुन: व्यवस्थित करके स्टैक मेमोरी उपयोग को अनुकूलित करने की अनुमति देता है?
#include <stdio.h>
void some_func(char*, int*, char*);
void stack_alignment(void) {
char a = '-';
int i = 1337;
char b = '+';
some_func(&a, &i, &b); // to prevent the compiler from removing the local variables
printf("%c|%i|%c", a, i, b);
}
यह निम्न विधानसभा उत्पन्न करता है (टिप्पणी अपने आप से कहा, मैं विधानसभा के लिए एक पूरा नौसिखिया हूँ):
$ vim stack-alignment.c
$ gcc -c -S -O3 stack-alignment.c
$ cat stack-alignment.s
.file "stack-alignment.c"
.section .rdata,"dr"
LC0:
.ascii "%c|%i|%c\0"
.text
.p2align 2,,3
.globl _stack_alignment
.def _stack_alignment; .scl 2; .type 32; .endef
_stack_alignment:
LFB7:
.cfi_startproc
subl $44, %esp
.cfi_def_cfa_offset 48
movb $45, 26(%esp) // local variable 'a'
movl $1337, 28(%esp) // local variable 'i'
movb $43, 27(%esp) // local variable 'b'
leal 27(%esp), %eax
movl %eax, 8(%esp)
leal 28(%esp), %eax
movl %eax, 4(%esp)
leal 26(%esp), %eax
movl %eax, (%esp)
call _some_func
movsbl 27(%esp), %eax
movl %eax, 12(%esp)
movl 28(%esp), %eax
movl %eax, 8(%esp)
movsbl 26(%esp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
addl $44, %esp
.cfi_def_cfa_offset 4
ret
.cfi_endproc
LFE7:
.def _some_func; .scl 2; .type 32; .endef
.def _printf; .scl 2; .type 32; .endef
आप देख सकते हैं वहाँ 3 स्थानीय हैं चर (a
, i
और b
) 1 बाइट, 4 बाइट और 1 बाइट के आकार के साथ। पैडिंग सहित यह 12 बाइट होगा (संकलक को 4 बाइट्स पर संरेखित करना)।
क्या यह अधिक मेमोरी कुशल नहीं होगा यदि कंपाइलर चर के क्रम को बदल देगा (a
, b
, i
)? फिर केवल 8 बाइट आवश्यक होंगे।
यहाँ एक "ग्राफिक" प्रतिनिधित्व:
3 bytes unused 3 bytes unused
vvvvvvvvvvv vvvvvvvvvvv
+---+---+---+---+---+---+---+---+---+---+---+---+
| a | | | | i | b | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+
|
v
+---+---+---+---+---+---+---+---+
| a | b | | | i |
+---+---+---+---+---+---+---+---+
^^^^^^^
2 bytes unused
संकलक (सी मानक आदि से) इस अनुकूलन करने की अनुमति दी है?
- यदि नहीं (जैसा कि मुझे लगता है कि असेंबली आउटपुट दिखाता है), क्यों?
- यदि हां, तो यह ऊपर क्यों नहीं होता है?
यह मानते हैं कि इसे मानकों आदि द्वारा अनुमत किया जाता है, तो यह व्यक्तिगत संकलक कार्यान्वयन पर पूरी तरह से होगा चाहे वे इसे करते हैं या नहीं। मुझे लगता है कि यह संकलन समय पर अनुकूलन स्तरों द्वारा नियंत्रित किया जाएगा। – John3136
कंपाइलर/ऑप्टिमाइज़र स्थानीय लोगों को जहां भी चाहें रखने के लिए स्वतंत्र है, जब तक कि यह प्रोग्राम को तोड़ नहीं देता है। यह एक ही स्थान पर दो चर रखने के लिए स्वतंत्र है यदि यह निश्चित है कि वे कभी भी एक ही समय में उपयोग नहीं किए जाते हैं। – mah
क्या आपने विभिन्न अनुकूलन विकल्पों के साथ संकलन करने का प्रयास किया है? शायद आपने अनुकूलन के साथ संकलित किया है। –