Как быть уверенным, что параметр будет рассматриваться как константа во время компиляции в C++?

Интересно, будут ли две следующие реализации производить одно и то же с одинаковыми характеристиками, какой бы компилятор я ни использовал:

template<class T, unsigned int TSIZE> MyClass1
{
    static const unsigned int size_const = 0;
    public:
        inline void Loop()
        {
            for(unsigned int i = 0; i < TSIZE; ++i) {
                /* DO SOMETHING ON DATA */
            }
        }
        T _data[TSIZE];
};

template<class T, unsigned int TSIZE> MyClass2
{
    static const unsigned int size_const = TSIZE;
    public:
        inline void Loop()
        {
            for(unsigned int i = 0; i < size_const; ++i) {
                /* DO SOMETHING ON DATA */
            }
        }
        T _data[size_const];
};

В первом случае, поскольку TSIZE, используемый в цикле, является параметром шаблона, почти гарантировано, что компилятор при необходимости развернет цикл. Если цикл развернут в первом случае, будет ли он развернут во втором случае (единственная разница в том, что TSIZE хранится в статической константе)?

Большое тебе спасибо.


person Vincent    schedule 03.08.2012    source источник
comment
Вы должны сообщить об ошибке поставщику компилятора, если он не оптимизирует две имеющиеся у вас версии одинаковым образом.   -  person jxh    schedule 04.08.2012
comment
Обе константы являются целыми константными выражениями. Они не получают больше константы, чем это.   -  person MSalters    schedule 04.08.2012


Ответы (2)


Будет ли компилятор выполнять оптимизацию или нет, зависит от того, будет ли он рассматривать значение как константу времени компиляции. В вашем конкретном примере и поскольку статическая константа нигде не была определена, если компоновщик не жаловался, это означает, что компилятор использовал ее только как константное выражение (постоянная времени компиляции). Также обратите внимание, что если бы компилятор не рассматривал size_const как константное выражение, то строка T _data[size_const] (я предполагаю, что вы потеряли T при копии) не скомпилировалась бы.

Любое использование odr (использование, отличное от константы времени компиляции) статического члена потребует определения.

person David Rodríguez - dribeas    schedule 03.08.2012

Логически у компилятора достаточно информации для выполнения описанной вами оптимизации, однако будет ли он на самом деле выполнять, это чрезвычайно зависит от реализации, и я не ожидаю, что он будет повсеместно поддерживаться.

person YePhIcK    schedule 03.08.2012
comment
За исключением того, что это постоянное распространение, одна из первых вещей, которую реализует любой оптимизирующий компилятор. :) - person GManNickG; 04.08.2012