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