boost :: multiprecision :: uint128_t sizeof равен 24

Основная математика (128/8 = 16) говорит по-разному. Я в некотором роде разочарован и хочу получить некоторые ответы — поскольку из того, к чему я привык, эта запись (type_num_of_bytes_t) описывает не только количество данных, которые вы можете поместить в переменную, но также кросс-платформенный фиксированный переменный размер, а последнее имхо еще важнее. Что я делаю неправильно?

#include "boost/multiprecision/cpp_int.hpp"using boost::multiprecision::uint128_t;

...

qDebug() << sizeof(uint128_t);

Выход: 24.

Я использую стандартный процессор архитектуры x86 / 64, компилируясь с vs2013 на Windows.

ОБНОВЛЕНИЕ: версия повышения 1.61.

3

Решение

cpp_int 1.6.1

Когда используется с фиксированной точностью, размер этого типа всегда на одно машинное слово больше, чем вы ожидаете для N-разрядного целого числа: дополнительное слово хранит как знак, так и количество машинных слов в целом числе, которые фактически используются. Последнее является оптимизацией для больших целых чисел с фиксированной точностью, так что 1024-битное целое имеет почти те же характеристики производительности, что и 128-битное целое, вместо того, чтобы быть в 4 раза медленнее для сложения и в 16 раз медленнее для умножения (при условии соответствующих значений всегда будет соответствовать 128 битам). Как правило, это означает, что вы можете использовать целочисленный тип, достаточно широкий для «наихудшего сценария», с незначительным ухудшением производительности, даже если большую часть времени арифметику можно было бы сделать с более узким типом.

Лишнее машинное слово (на x86/64 8 байт) делает размер 24 вместо ожидаемых 16.

9

Другие решения

Других решений пока нет …