Как проверить, известен ли параметр встроенной функции во время компиляции?

У меня есть встроенная функция, критическая для производительности. Он генерирует некоторые данные на основе параметра. Я хочу, чтобы компилятор оптимизировал генерацию данных для всех вызовов, когда параметр известен во время компиляции. Проблема в том, что я не могу заставить компилятор поместить оптимизированные данные из стека в статическую константу, поскольку маркировка данных статическими нарушит случай, когда параметр не является константой времени компиляции. Постоянные данные в стеке ухудшают производительность. Есть ли способ вывести (возможно, используя templates / boost :: enable_if), что параметр является константой времени компиляции, и выбрать соответствующую реализацию генерации данных?

УТОЧНЕНИЕ

В основном у меня есть что-то вроде следующего:

struct Data {
     int d_[16];
};

inline Data fun(int param)
{  //param can sometimes be a compile-time constant

    ... //generate the data
    Data res = {gen0, gen2, gen3, ..., gen15}; //put the data into result
    return res;
}

Итак, когда param не является константой времени компиляции, мы просто генерируем все данные и возвращаем.
что параметр является константой времени компиляции и выбрать подходящую реализацию генерации данных?

УТОЧНЕНИЕ

В основном у меня есть что-то вроде следующего:

struct Data {
     int d_[16];
};

inline Data fun(int param)
{  //param can sometimes be a compile-time constant

    ... //generate the data
    Data res = {gen0, gen2, gen3, ..., gen15}; //put the data into result
    return res;
}

Итак, когда param не является константой времени компиляции, мы просто генерируем все данные и возвращаем.
что параметр является константой времени компиляции и выбрать подходящую реализацию генерации данных?

УТОЧНЕНИЕ

В основном у меня есть что-то вроде следующего:

struct Data {
     int d_[16];
};

inline Data fun(int param)
{  //param can sometimes be a compile-time constant

    ... //generate the data
    Data res = {gen0, gen2, gen3, ..., gen15}; //put the data into result
    return res;
}

Итак, когда param не является константой времени компиляции, мы просто генерируем все данные и возвращаем.
Когда известен параметр , компилятор может оптимизировать генерацию данных. Но затем он не может оптимизировать следующую строку и генерирует большой объем кода, который просто устанавливает члены res на известные данные (данные встроены в программный код). Я хочу, чтобы компилятор создал статическую константу, а затем скопировал ее в возвращаемый объект (это быстрее, чем выполнение большого количества кода со встроенными данными). Поскольку это встроенная функция, даже копия может быть необязательной.

Заявление об ограничении ответственности

Этот вопрос отличается от Как использовать другую перегрузку встроенной функции, в зависимости от параметра времени компиляции? . Это более общая проблема.

5
задан Community 23 May 2017 в 12:32
поделиться