的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
和GCC
是两个完全独立的编译器。当您在源语言编写代码,您只指定要的机器要执行什么,不应该怎么做。编译器在选择他们的方式到那里,只要他们保持由您的源语言规定的范围内自由。所以这并不奇怪,这两个导致可执行文件大小不同。也由两个编译器所选择的指令可能差别很大(或完全),因为有,例如,十几个不同的方式来表示在机器代码循环(包括取目标处理器的并行执行的优点...或不)。您可能希望从2017年(https://www.youtube.com/watch?v=bSkpMdDe4g4)看看马特Godbolt的谈话;这可以给你一个简短而详尽的介绍在什么实际的编译器(你)做幕后。