уточнение замечательного куска моногамного кода - PullRequest
0 голосов
/ 03 октября 2018

Я недавно изучил открытый исходный код для своего проекта и наткнулся на следующий код:

source

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();
                ...

что происходит, если этого не сделано, делаеткомпилятор нарушает код?

Может кто-нибудь объяснить это более четко

1 Ответ

0 голосов
/ 09 октября 2018

@ Ян-Фокке комментарий над 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 faq, если вы хотите искать дальше:

Q : я использую компилятор / компоновщик, отличный от MSVC для лучшей оптимизации кода.Я все еще разрабатываю и строю свой проект с использованием Visual Studio.Будет ли IncrediBuild поддерживать используемый мной компилятор?

A : IncrediBuild в настоящее время поддерживает Microsoft cl.exe (все платформы Visual Studio, eVC, Xbox и Xbox 360) и компилятор Intel C ++.Дополнительные компиляторы могут быть поддержаны в будущем.Решение XGE Interfaces может использоваться с различными инструментами сборки и сценариями для запуска компиляторов, которые в настоящее время не поддерживаются.

...