Основная математика (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.
Когда используется с фиксированной точностью, размер этого типа всегда на одно машинное слово больше, чем вы ожидаете для N-разрядного целого числа: дополнительное слово хранит как знак, так и количество машинных слов в целом числе, которые фактически используются. Последнее является оптимизацией для больших целых чисел с фиксированной точностью, так что 1024-битное целое имеет почти те же характеристики производительности, что и 128-битное целое, вместо того, чтобы быть в 4 раза медленнее для сложения и в 16 раз медленнее для умножения (при условии соответствующих значений всегда будет соответствовать 128 битам). Как правило, это означает, что вы можете использовать целочисленный тип, достаточно широкий для «наихудшего сценария», с незначительным ухудшением производительности, даже если большую часть времени арифметику можно было бы сделать с более узким типом.
Лишнее машинное слово (на x86/64
8
байт) делает размер 24 вместо ожидаемых 16.
Других решений пока нет …