我可以在我的机器上手动构建我自己的.sln,或者让Azure DevOps在远程机器上构建它。该软件的目标是.NET Core3.1,并使用C++17。我注意到,从同一个分支构建相同的代码会产生不同大小的.exe:远程代码比本地代码少9KB。
当我将远程机器的VisualStudio2019版本升级为与我的版本相匹配时,我终于得到了相同的结果(从16.8到16.11.14)。但如何解释这种差异呢?小一点的档案里有遗漏什么吗?它应该具有所有相同的方法、逻辑和功能。没有错误,所以它的任何部分都不会编译失败。
我还必须使用Maven构建Java项目,并且听说可以根据Maven版本“稍微不同”构建Java项目。这在一开始是有道理的,但事后看来,我不知道这到底是什么意思。
是否有人真的在使用软件构建(特别是Visual及其C++编译器)来解释“略有不同的构建”的概念,或者有一个好主意?
两个版本在功能上都是相同的,还是没有简单的方法可以判断?
发布于 2022-05-15 16:14:42
C++标准并不规定编译器应该生成的机器代码。它只是指定了预期的可观察行为。
因此,例如,如果您有一个for循环,标准会指示行为(初始化、检查条件等等)。但您可以以各种方式将代码转换为机器代码,例如使用不同的寄存器,或以不同的顺序执行语句(只要可观察的行为相同)。
这个原则被称为以此类推。
因此不同的编译器(或编译器版本)可以生成不同的机器代码。原因可能是不同的优化,也可能是将C++转换为机器代码的不同方法(因为C++和机器代码之间的映射不是1-1)。
与优化相关的示例:
如果代码中有各种不依赖的语句(例如,修改不同的无关变量),如果内存访问模式更有效,编译器/优化器可能会重新排序它们。或者编译器/优化器可能会消除那些没有可观察行为的语句(比如增加一个以后永远不会读取的变量)。另一个例子是函数是否是内嵌,这完全取决于编译器/优化器,并影响二进制代码。
因此,对于编译后的二进制文件的大小(或内容),没有。
https://stackoverflow.com/questions/72249892
复制相似问题