All streams
Search
Write a publication
Pull to refresh
173
0
Антон Буков @k06a

Software Engineer

Send message
Ну мне показалось, что через шаблон удобнее. А тесты показали, что он ещё и быстрее.
Из Гулливера)) Рад, что вам понравилось.
union был нужен как раз чтобы не вылезал жуткий reinterpret_cast
>> Красиво, но, к сожалению, не эффективно.
Потому и «ненормально»))

>> В коде вместо 8 надо бы константу CHAR_BIT использовать.
Согласен, допишу к статье.

>> команда popcnt
Жаль она только в SSE4 появилась, мой Quad не тянет((

>> lookup table
Хотел бы дополнить ваш ответ ссылкой на описание нескольких весьма эффективных методов подсчёта числа установленных битов: http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetNaive
Спасибо за пример. Вот язык, что делали на совесть!
Код демонстрирует интересный прием использования стандартной библиотеки. В какой блог Вы предложите отнести этот код?
Это тоже заметил при правке ++ и --, спасибо.
Спасибо, что-то действительно странное там было с операторами ++ и --. Уже поправил, сейчас добавлю в статью.
Просто потом возможны траблы при forward declaration типа:
template<typename T>
struct LittleEndian;
Достаточно того что, он ругается если спутать class/struct.
Если к этому списку добавится ещё и union…
И это тоже)) Но скриншоты мне нравятся тем, что на них форматирование именно такое, какое я задумал. И никакие браузеры/посвечивалки синтаксиса и прочие инструменты мне ничего не испортят. Ссылка на код имеется в конце статьи.
Такие коды называются ПОЛИГЛОТЫ
Пытался сделать нечто подобное лет пять назад, чтобы J2ME программа могла сама себя раздавать по Bluetooth)) Тогда мне не хватило умения и опыта. Возможно стоит использовать ваши разработки. Спасибо, интересно почитать.
Я просто изначально к этому и стремился. Попытаюсь на днях интерфейсы отсортировать в своём методе, если выйдет, допишу к статье как UPDATE. Ох не хочется мне лезть в boost::mpl…
Я не понял сразу что вы имеете ввиду LittleEndian(const LittleEndian & t) и BigEndian(const BigEndian & t). Тут Вы правы, вполне можно заменить на копирование через тип T. Пожалуй я так и сделаю. Я думал речь идёт о конструкторах LittleEndian(const T &) и BigEndian(const T &). Раз уж делать копирование через T, то конечно нужно писать union, не кастовать же)) Спасибо ещё раз.
А я в свою очередь доволен, результатами проверок. Самому как-то не приходило в голову скорость протестировать, интуиция говорила, что компилятор тут нормально с этим справится — так и вышло. Спасибо Вам за труды. (Как заряд появится — плюсану)
Для одного из шаблонов работа будет неправильной. Так как вы будете делать это на архитектуре Little-Endian — то класс BigEndian перестанет правильно работать. Посмотрите внимательно, в классах разный код в этом месте…
Вот, адаптировал вашу версию к запуску на codepad.org: http://codepad.org/8GdiPBnI
Вы предлагаете заменить реализацию метода LittleEndian::operator=(), не так ли? А ведь BigEndian::operator=() заменить не получится, там цикл в другую сторону повернут… Итого на платформе Little-Endian можно изменить код классе LittleEndian. Сейчас код обоих классов работает под любой платформой. А вы предлагаете написать код, специализированный под конкретную платформу… Или я не так вас понял.
В статье есть ссылка на Wiki: ntohl(), htonl(), ntohs(), htons().
Там написано, что это набор функций, предусмотренный в стандарте POSIX.
Только считываться будет всегда значение Little-Endian (имеется ввиду текущая архитектура, просто LE значительно преобладает). А суть шаблона была хранить данные в указанном порядке байтов.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity