Neden bu kadar çok yer ayrılan yığın.
Bu soru Yığın Taşması soruya cevap geliyorWhy do books say, “the compiler allocates space for variables in memory”?OP göstermeye çalıştım nerede , ne zaman ayırırsan ne olur bir ve derleyici nasıl bellek boyutu ayırmaya bilen kod oluşturur. yığın değişken Görünüşe göre derleyici gerekli olandan çok daha fazla yer ayırır.
Aşağıdaki derleme ancak
#include <iostream>
using namespace std;
int main()
{
int foo;
return 0;
}
Visual C 2012 ile aşağıdaki çevirici çıkış yok optimizasyon, hata ayıklama modu: derlenmiş
int main()
{
00A31CC0 push ebp
00A31CC1 mov ebp,esp
00A31CC3 sub esp,0CCh // Allocates 204 bytes here.
00A31CC9 push ebx
00A31CCA push esi
00A31CCB push edi
00A31CCC lea edi,[ebp-0CCh]
00A31CD2 mov ecx,33h
00A31CD7 mov eax,0CCCCCCCCh
00A31CDC rep stos dword ptr es:[edi]
int foo;
return 0;
00A31CDE xor eax,eax
}
Benim program yapan bir daha int
aşağıdaki yukarıdaki satır yorum eklemek için:
00B81CC3 sub esp,0D8h // Allocate 216 bytes
Sorusunu akıllara tarafından @JamesKanze içinde cevabımı bağlantılı tepesinde, neden derleyici, ve görünüşe göre değil, yalnızca Visual C (yapmadım deneyi ile başka bir derleyici), ayrılan 204 ve 216 bayt sırasıyla, nerede ilk dava sadece ihtiyacı dört ve ikinci gereken sadece sekiz?
Bu program 32-bit çalıştırılabilir oluşturur.
Teknik açıdan, neden sadece 4 yerine 204 bayt ayırmaya ihtiyacı olabilir?
DÜZENLEME:
İki işlevi çağıran ve double
ve ana iki int
oluşturma, olsun
01374493 sub esp,0E8h // 232 bytes
Yukarıdaki düzen olarak aynı program için, serbest mod (iyileştirme) olarak bunu yapıyor
sub esp, 8 // Two ints
movsd QWORD PTR [esp], xmm0 // I suspect this is where my `double` goes
CEVAP
Bu ekstra boşluk /derleme seçeneği Zi oluşturulur. Devam Düzenlemek sağlar. Ekstra alan ayıklarken kod düzenlerken ekleyebilirsiniz yerel değişkenler için kullanılabilir.
Ayrıca problem değişkenleri başlatma etmemesi nedeniyle teşhis etmek kolaydır böylece 0xcccccccc tüm yerel değişkenleri başlatır /ACT etkisini görüyoruz. Tabii ki bu kuralların hiçbiri varsayılan Sürüm yapılandırma ayarları oluşturulur.
Neden&; dizi yineleme için... "* o kad...
Neden `1000000000000000 aralığı(100000...
Neden C derleme bu kadar uzun sürüyor?...
Aslında bir Yığın Taşma hatası neden o...
Neden tanıtan bir işe yaramaz MOV tali...