Я тестирую комбинации различных оптимизаций, и для них мне нужен статический -if, как описано вhttp://channel9.msdn.com/Events/GoingNative/GoingNative-2012/Static-If-I-Had-a-Hammerдля включения и отключения определенных оптимизаций. if (const -expr )не всегда работает, так как некоторые оптимизации включают изменение макета данных, а это невозможно сделать в области действия функции.
В основном я хочу вот этого:
template
class Algo{
struct Foo{
int a;
if(enable_optimization){
int b;
}
void bar(){
if(enable_optimization){
b = 0;
}
}
};
};
(Да, меньший объем памяти при удалении b из макета данных актуален в моем случае.)
В настоящее время я притворяюсь, используя очень плохой хак. Я ищу лучший способ сделать это.
Файл а.h
#ifndef A_H
#define A_H
template
class Algo;
#include "b.h"
#endif
Файл b.h (этот файл автоматически сгенерирован из скрипта Python)
#define ENABLE_OPTIMIZATION 0
#include "c.h"
#undef
#define ENABLE_OPTIMIZATION 1
#include "c.h"
#undef
Файл c.h
template<>
class Algo{
struct Foo{
int a;
#if ENABLE_OPTIMIZATION
int b;
#endif
void bar(){
#if ENABLE_OPTIMIZATION
b = 0;
#endif
}
};
};
Кто-нибудь знает лучший способ сделать это? Теоретически это можно сделать с помощью шаблонного метапрограммирования, и поначалу я им пользовался. По крайней мере, то, как я его использовал, было занозой в заднице и приводило к совершенно нечитаемому и раздутому коду. Использование приведенного выше хака привело к значительному повышению производительности.
РЕДАКТИРОВАТЬ :У меня есть несколько флагов оптимизации, и они взаимодействуют.