澄清一段非凡的单人游戏代码
clarification remarkable piece of monogame code
我最近研究了我的项目的开源代码并发现了以下代码。
internal ContentTypeReader[] LoadAssetReaders(ContentReader reader)
{
#pragma warning disable 0219, 0649
// Trick to prevent the linker removing the code, but not actually execute the code
if (falseflag)
{
// Dummy variables required for it to work on iDevices ** DO NOT DELETE **
// This forces the classes not to be optimized out when deploying to iDevices
var hByteReader = new ByteReader();
var hSByteReader = new SByteReader();
var hDateTimeReader = new DateTimeReader();
...
如果不这样做会发生什么,编译器会破坏代码吗?
谁能更清楚地解释一下
@Jan-Fokke if
上方的评论和里面的评论解释了为什么需要这样做。 #pragma warning disable 0219, 0649
的细分将抑制两个特定的警告:
CS0219 当变量被声明但从未使用时生成。您可以通过创建一个未在任何地方使用的变量来轻松地在您自己的代码中进行尝试。在某些系统中,警告会破坏构建,如果您无法摆脱特定的警告,您可以选择抑制它。
CS0649 我不确定为什么会被触发(可能来自之前的迭代)警告将是:编译器检测到未初始化的私有或内部字段从未赋值的声明。
所以第二条评论的意思是,如果编译器找不到这些 类 的任何实例,它将在 iDevices 上删除它们。编译器优化策略通常非常复杂,通常当您看到这样的代码时 - 这意味着代码库背后的团队正在努力解决这个问题并最终解决了这个问题。
查看以下链接以了解有关编译器优化和 DCE [死代码消除]的更多信息
https://en.wikipedia.org/wiki/Dead_code_elimination
https://www.mono-project.com/docs/about-mono/languages/csharp/#cil-optimizations
以下来自 Incredibuild 常见问题解答,如果您想进一步搜索:
Q:我使用的是不同于 MSVC 的 compiler/linker 以获得更好的代码优化。我仍然使用 Visual Studio 开发和构建我的项目。 IncrediBuild 是否支持我正在使用的编译器?
A:IncrediBuild 目前支持 Microsoft 的 cl.exe(所有 Visual Studio、eVC、Xbox 和 Xbox 360 平台)和 Intel C++ 编译器。将来可能会支持其他编译器。 XGE Interfaces 解决方案可与各种构建工具和脚本一起用于 运行 当前不支持的编译器。
我最近研究了我的项目的开源代码并发现了以下代码。
internal ContentTypeReader[] LoadAssetReaders(ContentReader reader)
{
#pragma warning disable 0219, 0649
// Trick to prevent the linker removing the code, but not actually execute the code
if (falseflag)
{
// Dummy variables required for it to work on iDevices ** DO NOT DELETE **
// This forces the classes not to be optimized out when deploying to iDevices
var hByteReader = new ByteReader();
var hSByteReader = new SByteReader();
var hDateTimeReader = new DateTimeReader();
...
如果不这样做会发生什么,编译器会破坏代码吗?
谁能更清楚地解释一下
@Jan-Fokke if
上方的评论和里面的评论解释了为什么需要这样做。 #pragma warning disable 0219, 0649
的细分将抑制两个特定的警告:
CS0219 当变量被声明但从未使用时生成。您可以通过创建一个未在任何地方使用的变量来轻松地在您自己的代码中进行尝试。在某些系统中,警告会破坏构建,如果您无法摆脱特定的警告,您可以选择抑制它。
CS0649 我不确定为什么会被触发(可能来自之前的迭代)警告将是:编译器检测到未初始化的私有或内部字段从未赋值的声明。
所以第二条评论的意思是,如果编译器找不到这些 类 的任何实例,它将在 iDevices 上删除它们。编译器优化策略通常非常复杂,通常当您看到这样的代码时 - 这意味着代码库背后的团队正在努力解决这个问题并最终解决了这个问题。
查看以下链接以了解有关编译器优化和 DCE [死代码消除]的更多信息
https://en.wikipedia.org/wiki/Dead_code_elimination https://www.mono-project.com/docs/about-mono/languages/csharp/#cil-optimizations
以下来自 Incredibuild 常见问题解答,如果您想进一步搜索:
Q:我使用的是不同于 MSVC 的 compiler/linker 以获得更好的代码优化。我仍然使用 Visual Studio 开发和构建我的项目。 IncrediBuild 是否支持我正在使用的编译器?
A:IncrediBuild 目前支持 Microsoft 的 cl.exe(所有 Visual Studio、eVC、Xbox 和 Xbox 360 平台)和 Intel C++ 编译器。将来可能会支持其他编译器。 XGE Interfaces 解决方案可与各种构建工具和脚本一起用于 运行 当前不支持的编译器。