Exist c ++ std решение для int128 для всех компиляторов? [Дубликат]

Третий матч в google для «C ++ slicing» дает мне эту статью в Википедии http://en.wikipedia.org/wiki/Object_slicing и этот (нагретый, но первые несколько сообщений определяют проблему ): http://bytes.com/forum/thread163565.html

Таким образом, это когда вы назначаете объект подкласса суперклассу. Суперкласс ничего не знает о дополнительной информации в подклассе и не имеет места для его хранения, поэтому дополнительная информация получает «отрезанный».

Если эти ссылки не дают достаточной информации для «хороший ответ», пожалуйста, отредактируйте свой вопрос, чтобы сообщить нам, что еще вы ищете.

47
задан danijar 26 August 2013 в 09:30
поделиться

4 ответа

Поддержка GCC и Clang __int128

26
ответ дан doron 21 August 2018 в 09:30
поделиться

Выполнение boost :

#include <boost/multiprecision/cpp_int.hpp>

using namespace boost::multiprecision;

int128_t v = 1;

Это лучше, чем строки и массивы, особенно если вам нужно выполнить с ним арифметические операции.

36
ответ дан Craig McQueen 21 August 2018 в 09:30
поделиться

Хотя GCC предоставляет __int128, он поддерживается только для целей (процессоров), которые имеют целочисленный режим, достаточно широкий для хранения 128 бит. В данной системе sizeof () intmax_t и uintmax_t определяют максимальное значение, которое поддерживает компилятор и платформа.

23
ответ дан Onkar 21 August 2018 в 09:30
поделиться
  • 1
    Приобретено, потому что это указывает на проблему с принятым ответом. – CppNoob 2 February 2016 в 12:36
  • 2
    Это не совсем правильно: __int128_t поддерживается на x86-64 (но не i386). Он реализован в 64-битных целочисленных регистрах с использованием кода с добавлением-переносом и расширенной точностью для сдвигов, умножений и т. Д. (Регистры векторов SSE 128b не полезны ни для чего, кроме boolean (AND / OR / XOR), потому что они не могут сделать ни одного добавления 128b. SSE может делать два добавления 64b или несколько меньших элементов). – Peter Cordes 14 February 2016 в 23:48

Ваш вопрос состоит из двух частей.

1. 128-bin integer. Как предложено @PatrikBeck boost::multiprecision, это хороший способ для действительно больших целых чисел.

2.Variable для хранения UUID / GUID / CLSID или того, что вы его называете. В этом случае boost::multiprecision не является хорошей идеей. Вам нужна структура GUID , которая предназначена для этой цели. По мере добавления кросс-платформенного тега вы можете просто скопировать эту структуру в свой код и сделать это следующим образом:

struct GUID
{
    uint32_t Data1;
    uint16_t Data2;
    uint16_t Data3;
    uint8_t Data4[8];
};

Этот формат определен Microsoft по ряду внутренних причин, вы можете даже упростить его:

struct GUID
{
    uint8_t Data[16];
};

Вы получите лучшую производительность, имеющую простую структуру, а не объект, который может обрабатывать множество разных вещей. В любом случае вам не нужно делать математику с GUIDS, так что вам не нужен какой-либо причудливый объект.

4
ответ дан ST3 21 August 2018 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: