У меня есть встроенная функция, критичная к производительности. Он генерирует некоторые данные на основе параметра. Я хочу, чтобы компилятор оптимизировал генерацию данных для всех вызовов, где параметр известен во время компиляции. Проблема в том, что я не могу заставить компилятор поместить оптимизированные данные из стека в статическую константу, так как маркировка данных static
нарушит случай, когда параметр не является постоянной времени компиляции. Наличие постоянных данных в стеке снижает производительность. Есть ли способ сделать вывод (возможно, с помощью 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
не является постоянной времени компиляции, мы просто генерируем все данные и возвращаем.
Когда известно param
, компилятор может оптимизировать генерацию данных. Но затем он не может оптимизировать следующую строку и генерирует много кода, который просто устанавливает res
членов для известных данных (данные внедряются в программный код). Я хочу, чтобы компилятор создал статическую константу, а затем скопировал ее в возвращаемый объект (это быстрее, чем выполнение большого количества кода со встроенными данными). Поскольку это встроенная функция, даже копирование может не потребоваться.
Отказ
Этот вопрос отличается от Как использовать различную перегрузку встроенной функции в зависимости от параметра времени компиляции? . Это более общая проблема.