инициализация структуры / конструктор с использованием метапрограммирования - PullRequest
0 голосов
/ 26 ноября 2018

Чтобы реализовать Блок с плавающей точкой , я использую следующую структуру в своем коде:

struct ff32{
    int16_t _exp;
    int32_t _frac;

    ff32(int16_t e, int32_t f)
        : _exp(e), _frac(f)
    {};
};

Я могу создать переменные этого типа структуры и инициализировать их следующим образом:

ff32 x(2, 0x60000000);
ff32 y = {2, 0x60000000};

Я хотел бы расширить конструктор, включив в него тип данных с плавающей запятой, следующим образом:

struct ff32{
    int16_t _exp;
    int32_t _frac;

    ff32(int16_t e, int32_t f)
        : _exp(e), _frac(f)
    {};

    ff32(float x)
    {
        // some code that extract _exp and _frac 
        // for a given floating-point number x
    };
};

Я уже реализовал тело конструктора ff32 (float x), но яне хочу, чтобы этот код выполнялся во время выполнения для постоянных аргументов с плавающей запятой, например, ff32 (2.7f).Возможно ли достичь этого с помощью какого-либо метапрограммирования?Следует также отметить, что моя цепочка инструментов поддерживает только C ++ 11.

1 Ответ

0 голосов
/ 05 февраля 2019

Никакого метапрограммирования здесь не требуется.

Функция ff32(float x) будет создана в любом случае, но, как упоминал Клаус, вы можете положиться на оптимизацию компилятора, чтобы заменить его результат на поплавках constexpr соответствующимизначения без вызова функции во время выполнения.Просто используйте следующие вычисления (которые могут быть выполнены во время компиляции):

struct float32{
    unsigned const bits;
    unsigned const exponent;
    unsigned const fraction;
    bool const sign;

    constexpr float32(float input_float):
        bits(*reinterpret_cast<unsigned*>(&input_float)),
        exponent((bits & 0x7f800000) >> 23),
        fraction((bits & 0x007fffff)),
        sign((bits & 0x80000000) > 0)
    {}
};

вы можете посмотреть сборку, которую ваш код компилирует в здесь .Убедитесь, что вы используете флаг -O3 и посмотрите, как это работает на поплавках constexpr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...