Числовые типы за пределами cstdint - PullRequest
4 голосов
/ 30 ноября 2011

Я регулярно использую типы из cstdint (например, uint32_t) в своем коде, но теперь они не совсем соответствуют моим потребностям, особенно в отношении шаблонов.

Есть ли способ указать целочисленный тип, который в два раза больше аргумента шаблона? Когда моему шаблону передается uint32_t, мне нужно создать uint64_t для одной переменной внутри функции. Возможно, еще сложнее, когда передается uint64_t, мне нужно создать uint128_t. Я мог бы сделать это с массивом из двух аргументов шаблона, но тогда я не могу передать этот массив другим функциям шаблона. Это критический раздел производительности (я занимаюсь криптографией).

В связи с этим, есть ли какой-нибудь другой заголовок, который я могу включить (в порядке предпочтения: стандарт, повышение, прочее), который дает мне 128-битные целые числа? Похоже, что этот вопрос отвечает именно этой части: Самая быстрая 128-битная целочисленная библиотека

Есть ли способ указать, что я хочу использовать наибольшее доступное целое число, которое не превышает определенный размер? Этот максимальный размер также будет функцией sizeof (T).

1 Ответ

5 голосов
/ 30 ноября 2011

«Расширенная арифметика» является недостатком семейства языков C.Нет способа получить флаг целочисленного переполнения процессора, поэтому нет портативного способа написать оптимальный 128-битный целочисленный класс.

Для лучшей производительности (чтобы конкурировать с другими криптографическими библиотеками), вам может понадобитьсястатическая библиотека с пользовательской сборкой внутри.К сожалению, я не знаю переносимого (широко портированного) интерфейса к такому.

Если вы просто хотите отобразить карту для каждого базового типа с N битами на карту с 2N битами, то создайте простую метафункцию:

template< typename half >
struct double_bits;

template<>
struct double_bits< std::uint8_t >
    { typedef std::uint16_t type; };

template<>
struct double_bits< std::uint16_t >
    { typedef std::uint32_t type; };

template<>
struct double_bits< std::uint32_t >
    { typedef std::uint64_t type; };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...