Сначала давайте установим, что класс BitConverter
специально предназначен для преобразования бит только для локального процессора .Вот почему IsLittleEndian
только для чтения.В результате он не поддерживает преобразование в или из старшего порядкового номера, если локальный процессор имеет младший порядок и наоборот.
Хотя я не знаю причин для исключения поддержки общего порядка байтов, наиболее логичнымпричина для меня производительность .Класс, который широко используется во всем фреймворке по своему прямому назначению (преобразование в непосредственный порядок и из собственного процессора), должен быть как можно более быстродействующим.Ограничивая общность класса, его производительность улучшается за счет ограничения случаев, которые должны быть обработаны.Поддерживая только little-endian, он, вероятно, измерим быстрее .
ОК, так что теперь мы переходим к сути вопроса.Зачем авторам включать код для работы как с прямым порядком байтов, так и с прямым порядком байтов, если общий дизайн класса намеревается поддерживать только один?
Опять же, мы можем только строить догадки.Но ответ, вероятно, заключается в двух наблюдениях:
- дизассемблированный код, который ссылается на
IsLittleEndian
, является неважным с точки зрения производительности - написанием переносимого кода,если это не влияет на производительность, это хорошая программная инженерия
Причина, по которой код, скопированный из метода ToInt32
, не важен, потому что он толькоиспользуется для памяти без выравнивания .Путь кода 99% является прямым небезопасным "memcpy" битов.
Даже в том случае, если происходит преобразование из невыровненной памяти, код, обрабатывающий его, на порядок менее эффективен, чем необработанныйметод.Таким образом, дополнительное условие не влияет на производительность.
Чистый результат:
- Класс
BitConverter
максимально эффективен для его ограниченногопредназначение - Исходный код для
BitConverter
, тем не менее, переносим на архитектуры процессоров с прямым порядком байтов