如何确保在C ++编译期间将参数视为常量?

时间:2012-08-03 20:43:28

标签: c++ templates optimization compilation loop-unrolling

我想知道无论我使用何种编译器,以下两个实现是否会产生完全相同的性能:

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存储在静态const中)?

非常感谢。

2 个答案:

答案 0 :(得分:5)

编译器是否执行优化不同于它是否将值视为编译时常量。在您的特定示例中,并且因为静态const未在任何地方定义,如果链接器没有抱怨它意味着编译器仅将其用作const表达式(编译时常量)。另请注意,如果编译器没有将size_const视为const表达式,那么行T _data[size_const](假设您在副本上丢失了T)将无法编译。

静态成员的任何 odr-use (除了作为编译时常量之外)都需要定义

答案 1 :(得分:0)

逻辑上,编译器确实有足够的信息来执行您正在描述的优化,但是它是否实际执行它是非常依赖于实现的,我不希望它得到普遍支持