首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不同版本的Visual构建C++代码会产生不同的.exe文件大小?

使用不同版本的Visual构建C++代码会产生不同的.exe文件大小?
EN

Stack Overflow用户
提问于 2022-05-15 15:55:45
回答 1查看 140关注 0票数 0

我可以在我的机器上手动构建我自己的.sln,或者让Azure DevOps在远程机器上构建它。该软件的目标是.NET Core3.1,并使用C++17。我注意到,从同一个分支构建相同的代码会产生不同大小的.exe:远程代码比本地代码少9KB。

当我将远程机器的VisualStudio2019版本升级为与我的版本相匹配时,我终于得到了相同的结果(从16.8到16.11.14)。但如何解释这种差异呢?小一点的档案里有遗漏什么吗?它应该具有所有相同的方法、逻辑和功能。没有错误,所以它的任何部分都不会编译失败。

我还必须使用Maven构建Java项目,并且听说可以根据Maven版本“稍微不同”构建Java项目。这在一开始是有道理的,但事后看来,我不知道这到底是什么意思。

是否有人真的在使用软件构建(特别是Visual及其C++编译器)来解释“略有不同的构建”的概念,或者有一个好主意?

两个版本在功能上都是相同的,还是没有简单的方法可以判断?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-15 16:14:42

C++标准并不规定编译器应该生成的机器代码。它只是指定了预期的可观察行为

因此,例如,如果您有一个for循环,标准会指示行为(初始化、检查条件等等)。但您可以以各种方式将代码转换为机器代码,例如使用不同的寄存器,或以不同的顺序执行语句(只要可观察的行为相同)。

这个原则被称为以此类推

因此不同的编译器(或编译器版本)可以生成不同的机器代码。原因可能是不同的优化,也可能是将C++转换为机器代码的不同方法(因为C++和机器代码之间的映射不是1-1)。

与优化相关的示例:

如果代码中有各种不依赖的语句(例如,修改不同的无关变量),如果内存访问模式更有效,编译器/优化器可能会重新排序它们。或者编译器/优化器可能会消除那些没有可观察行为的语句(比如增加一个以后永远不会读取的变量)。另一个例子是函数是否是内嵌,这完全取决于编译器/优化器,并影响二进制代码。

因此,对于编译后的二进制文件的大小(或内容),没有

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72249892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档