SORU
4 NİSAN 2013, PERŞEMBE


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
4 NİSAN 2013, PERŞEMBE


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Caramthros

    Caramthros

    10 AĞUSTOS 2007
  • Maschine Tutorials

    Maschine Tut

    15 ŞUBAT 2011
  • StalkerJS

    StalkerJS

    15 HAZİRAN 2010