C++ 模板函数、模板类:如果没有被使用就不会被实例化

C++中如果一个模板函数没有使用过,那么其局部静态变量都不会被实例化:

class A {
public:
    A() {
        edward::print("A ctor");
    }
};

template<typename T>
void test() {
    static A a;
}

int main() {
    test<int>();	//如果注释掉则不会有输出
    return 0;
}

A ctor

如果不显示地调用test函数,局部静态变量a是不会被实例化的。

同样的,如果一个静态类没有被实例化,那么他的成员也不会被实例化,就算这个静态类实例化了,但是没有使用一些静态变量、方法,那么这些没有使用的东西是不会被实例化的。注意:成员变量在模板类实例化后无论是否使用都存在。

class A {
public:
    A() {
        edward::print("A ctor");
    }
};

template<typename T>
class Test {
public:
    static A a;
    A aa;
};

template<typename T>
A Test<T>::a;

int main() {
    Test<int> test;
//    test.a;	//如果取消注释会多打印一条语句	
    return 0;
}

A ctor

通过观察注释的语句,我们发现模板类的静态变量a如果没有被使用,那么即使模板类实例化也不存在(具体来说就是不分配内存,不调用构造函数)。
至于静态方法和成员方法更是如此了,在《C++ Primer》第五版 16.1.2 类模板-类模板成员函数的实例化这部分提到:如果一个成员函数没有被使用,那么它不会被实例化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值