为什么函数定义的顺序会改变输出二进制?

时间:2014-05-10 12:05:01

标签: c

鉴于这两个C程序

功能原型和声明
after.c

#include<stdio.h>
void hi();
int main(){
  hi();
  return 0;
}
void hi(){
  puts("hello world");
}

仅限功能定义
before.c

#include<stdio.h>
void hi(){
  puts("hello world");
}

int main(){
  hi();
  return 0;
}

编译:
cc -o after.c. cc -obefore.c之前

md5sum *
以后的efac7a08389095a718b7fc9e163719ca 41e81298acdf96091b4a9326a4557b0c after.c
b5之前的d5b87a14479e764f1c8a8669182773a1 924ec57ea6ef7ee306edfd0ec7f5fd54 before.c

如您所见,它将生成不同的二进制文件。为什么会这样?之前和之后有什么不同?有速度差异吗?

1 个答案:

答案 0 :(得分:4)

编译器/链接器工具链不需要为等效程序生成具有相同校验和的可执行文件。实际上,某些平台上的某些编译器会在同一程序重建两次时产生不同的可执行文件。

例如,请参阅exe checksum different after each recompile

你必须对可执行文件进行概要分析,看看是否有任何性能差异(在你的例子中,几乎肯定没有)。