GCC, clang / llvm, размер файла exe - PullRequest
0 голосов
/ 21 января 2019

Windows 10, LLVM 7, GCC 8.1, Visual studio 2019.

#include <iostream>
#include <fstream>
using namespace std;

char exe[1000000] = {};
int n = 0;
int filesize;
void read() {
    int pointer = 0;
    cin >> filesize;
    fstream f;
    f.open("s.exe", ios::in | ios::app | ios::binary);
    f.seekp(pointer, ios::beg);
    while (pointer < filesize) {
        f.read((char*)&n,sizeof(char));
        exe[pointer] = n;
        pointer += 1;
    }
    f.close();
}
void showMassive(){
    int pointer = 0;
    while(pointer<filesize){
    cout << pointer << ":" << (unsigned int8_t)exe[pointer] << endl;
    pointer+=1;
    }
}
void showAssembler(){

}
void write() {
    int pointer = 0;
    fstream f;
    f.open("s1.exe", ios::out | ios::app | ios::binary);
    f.seekp(pointer, ios::beg);
    while (pointer < filesize) {
        n=exe[pointer];
        pointer += 1;
        f.write((char*)&n,sizeof(char));
    }
    f.close();
}
void MachineCodeOptimizer(){
    //some code
    exe[1031] += 1;//just for example
}
int main(){
    read();
    showMassive();
    showAssembler();
    MachineCodeOptimizer();
    write();
    return 0;
}
  • этот код. Clang создает исполняемый файл в лучшем случае размером 312 килобайт (клавиша -O1). GCC в любом случае создает exe размером 66 КБ. Что просходит? Почему такие различия между компиляторами? Я смотрю на машинный код, но не понимаю. Сейчас я попробовал визуальную студию 2019 - 26 КБ! Visual Studio 2019 показывает результат, близкий к ассемблеру (в размере файла).

1 Ответ

0 голосов
/ 21 января 2019

Clang и GCC - два полностью независимых компилятора. Когда вы пишете код на исходном языке, вы указываете , что вы хотите, чтобы машина выполняла, а не как , которое должно это делать. Компиляторы свободны в выборе своих способов добраться до тех пор, пока они остаются в пределах, указанных вашим исходным языком. Поэтому неудивительно, что два полученных исполняемых файла отличаются по размеру файла. Кроме того, выбранные инструкции двумя компиляторами могут сильно (или полностью) отличаться, поскольку, например, существует дюжина различных способов представления циклов в машинном коде (в том числе использование преимуществ параллельного выполнения целевого процессора ... или нет). ). Возможно, вы захотите ознакомиться с выступлением Мэтта Годболта от 2017 года (https://www.youtube.com/watch?v=bSkpMdDe4g4);), которое может дать вам краткое, но исчерпывающее представление о том, что на самом деле делают (для вас) компиляторы.

...