GCC,clang / llvm,exe文件大小

时间:2019-01-20 21:39:50

标签: gcc clang exe

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 KB大小的exe文件(-O1键)。无论如何,GCC都会创建66 KB大小的exe。怎么了?为什么在编译器之间如此不同?我看机器代码,但不明白。现在我尝试了Visual Studio 2019-26 KB! Visual Studio 2019显示的结果接近于汇编器(文件大小)。

1 个答案:

答案 0 :(得分:0)

ClangGCC是两个完全独立的编译器。当用源语言编写代码时,仅指定要让计算机执行的 ,而不是如何。编译器可以自由选择到达那里的方式,只要它们保持在源语言所指定的范围内即可。因此,两个生成的可执行文件的文件大小不同也就不足为奇了。另外,两个编译器选择的指令可能会有很大的不同(或完全不同),因为例如有十几种不同的方式来表示机器代码中的循环(包括利用目标处理器的并行执行优势... )。您可能想查看2017年马特·戈德博特(Matt Godbolt)的演讲(https://www.youtube.com/watch?v=bSkpMdDe4g4);这可以为您简要而详尽地介绍编译器在幕后为您实际执行的操作。