Od czego zależy wielkość pliku .exe ?

0

Siemanko :)

Ostatnio podczas pisania swojej "aplikacji" :) z ciekawości zobaczyłem ile ma kb plik .exe - okazało się, że ma (na 110 lini kodu) aż 891kb! Piszę w Code::Blocks (MinGW chyba 64) - I tu rodzi się pytanie, co powoduje taki duży rozmiar ? Czy zastosowanie innych zmiennych spowoduje jakieś efekty ? Czy może dołączenie mniejszej ilości bibliotek w postaci zamienników ? Aha i nie sugerujcie się kodem :D - znam tylko podstawy btw. apka jest nie skończona i dość poważnie szwankuje :/ - myślę, że dobrze opisałem problem - to wy sobie myślcie a ja idę pisać ją dalej :)

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <time.h>
void menu()
{
    using namespace std;
    cout << "################################################################################" << endl;
    cout << "##############################  ------------------------  ###############################" << endl;
    cout << "############################## [1] Nowa Gra  [1] ###############################" << endl;
    cout << "############################## [2] Wczytaj   [2] ###############################" << endl;
    cout << "############################## [3] Opcje     [3] ###############################" << endl;
    cout << "############################## [4] Wyjscie   [4] ###############################" << endl;
    cout << "################################################################################" << endl;
}
bool czy_rozegrano(bool status) // tzn. czy rozegrac na nowo ?
{

}
bool czy_od_nowa(bool status_rozegrania = 0)
{
    status_rozegrania++;
    return status_rozegrania;
}

bool wczytaj_gre()
{
    using namespace std;
    cout << "WCZYTAJ GRE: BRAK" << endl;
    cout << "Potrzebna aktualizacja - brak opcji" << endl;
    cout << "[1] Zakoncz" << endl << "[2] Powrot" << endl;
    int x;
    cin >> x;
    switch (x)
    {
    case 1:
        return false;
        break;
    case 2:
        system( "cls" );
        return true;
        break;
}
}

bool opcje()
{
    using namespace std;
    cout << "MENU OPCJI: BRAK" << endl;
    cout << "Potrzebna aktualizacja - brak opcji" << endl;
    cout << "[1] Zakoncz" << endl << "[2] Powrot" << endl;
    int x;
    cin >> x;
    switch (x)
    {
    case 1:
        break;
        return false;
    case 2:
        system( "cls" );
        return true;
}
}
char odczyt_klawiatury()
{
    char znak;
    znak = getch();
    return znak;
}
int main()
{
    using namespace std;

    bool status_gry;
    srand(time( NULL ) );
    menu();
    int y;
    cin >> y;
        switch (y)
        {
        case 1:
            czy_od_nowa();
            break;
        case 2:
            system( "cls" );
            wczytaj_gre();
            bool status_wczytywania;
            status_wczytywania = wczytaj_gre();
            if (status_wczytywania = true) // to powroc do menu
            main();
            break;
        case 3:
            system( "cls" );
            opcje();
            bool status_opcji;
            status_opcji = opcje();
            if (status_opcji = true) // to powroc do menu
            main();
            break;
        case 4:
            system( "cls" );
            break;
        default :
            system( "cls" );
                cout << "Wybierz 1,2,3 lub 4 !" << endl;
            main();
            break;
        }
}

dodanie znacznika <code class="cpp"> - furious programming

2

Rozmiar zależy od kompilatora, od ilości kodu w projekcie i od liczby bibliotek które zostaną zlinkowane.

0

@winerfresh Mówiłem, że nie jest dokończona - ja nie mam problemu z apką tylko z jej rozmiarem. Czego unikać i co stosować aby aplikacja była mniejsza

Shalom napisał(a):

Rozmiar zależy od kompilatorowa, od ilości kodu w projekcie i od liczby bibliotek które zostaną zlinkowane.

np. ilości znaków ? (nazwy zmiennych itp.)

1

Nie, nie od ilości znaków. Od ilości sensownego kodu. A dokładniej o tego ile kodu asemblera się z tego wygeneruje.

1

rozmiar exeka jest sumą trzech:

  • własnego kodu
  • bibliotek linkowanych statycznie (w tym biblioteki standardowe C i C++, tzw. runtime)
  • danych debugera doklejanych do exeka

MinGW (czyli GCC) domyślnie generuje dane dla debugera. parametr -g je usuwa, znacząco zmniejszając exeka, ale utrudnia to albo wręcz uniemożliwia debugowanie programu.

można też te dane usunąć programem strip z pakietu MinGW.

strip program.exe
0

Dzięki za pomoc. Zwłaszcza za dwie ostatnie ;)

Azarien napisał(a):

rozmiar exeka jest sumą trzech:

  • własnego kodu
  • bibliotek linkowanych statycznie (w tym biblioteki standardowe C i C++, tzw. runtime)
  • danych debugera doklejanych do exeka

MinGW (czyli GCC) domyślnie generuje dane dla debugera. parametr -g je usuwa, znacząco zmniejszając exeka, ale utrudnia to albo wręcz uniemożliwia debugowanie programu.

można też te dane usunąć programem strip z pakietu MinGW.

strip program.exe

Czyli, że robić to jak już będę uważał aplikację za skończoną, co ? A wie ktoś gdzie ustawić ten parametr ?

1
Azarien napisał(a):

rozmiar exeka jest sumą trzech:
można też te dane usunąć programem strip z pakietu MinGW.

strip program.exe

Dla takich amatorskich projektów jak najbardziej stripowanie ma sens, jednak już dla komercji usuwanie takich "zbędnych" relokacji powoduje wyłączenie mechanizmu randomizacji bazy w aplikacjach (mechanizm ASLR) co naraża projekt na skuteczne ataki, to samo tyczy się np. usuwania struktur IMAGE_LOAD_CONFIG_DIRECTORY co już parę razy widziałem w różnych exe stripperach/pakerach, co skutkuje wyłączeniem mechanizmu bezpiecznego wyłapywania wyjątków SAFESEH i znowu otwiera aplikację na potencjalne wektory ataku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1