【问题标题】:Forcing the compiler to generate code for all member functions of a template class?强制编译器为模板类的所有成员函数生成代码?
【发布时间】:2014-01-16 16:01:54
【问题描述】:

假设我有这个程序

#include <iostream>

using namespace std;

template<typename T>
class A {
public:
    void foo() { cout << "Inside foo" << endl; }
    void bar() { cout << "Inside bar" << endl; }
};

int main() {
  A<int> a;
  a.foo();
  return 0;
}

g++ 和 clang++ 都只为A&lt;int&gt;::foo() 生成代码,而不为A&lt;int&gt;::bar() 生成代码。当您想在调试时调用此函数时,这很烦人。 (例如vector&lt;T&gt;::at())。

是否有一些标志或其他方法可以在每次实例化模板时强制为所有成员函数生成代码?

【问题讨论】:

    标签: c++ instantiation


    【解决方案1】:

    没有编译器标志,但语言的规则控制着这里发生的事情,您可以利用它们来发挥自己的优势。

    由于您隐式实例化A&lt;int&gt;,因此仅实例化您使用的函数:

    [C++11: 14.7.1/1]: [..] 类模板特化的隐式实例化导致类成员函数、成员类的声明而不是定义或默认参数的隐式实例化、作用域成员枚举、静态数据成员和成员模板; [..]

    如果你显式实例化A&lt;int&gt;,那么整个事情都会被实例化。

    #include <iostream>
    
    using namespace std;
    
    template<typename T>
    class A {
    public:
        void foo() { cout << "Inside foo" << endl; }
        void bar() { cout << "Inside bar" << endl; }
    };
    
    template class A<int>;   // <----
    
    int main() {
      A<int> a;
      a.foo();
    }
    

    这里有一些证据:http://coliru.stacked-crooked.com/a/582126aac45d6ea4

    【讨论】:

    • 当然!但这需要作者明确地实例化他在调试时认为需要的所有模板专业化(A-int、A-double、A-vector-foo& 等)。我认为这是一个临时解决方案,并玩而是链接和优化标志..
    • 如果你能找到一些违反标准的工具链标志,那就去吧。我没兴趣。 :)
    • 我找到了,也同意! ;)
    【解决方案2】:

    显式实例化它:

    template class A<int>;
    

    【讨论】:

    • @quetzalcoatl:不。这是明确的专业化; OP 正在使用隐式专业化。
    • 只是实例化,不会强制编译模板类中目前没有用到的方法!!
    【解决方案3】:

    除了其他人所说的模板实例化之外,您可能会发现将某些函数/方法声明为“已使用”很有用,以防止优化器在它们看起来未使用时将其删除。

    http://gcc.gnu.org/onlinedocs/gcc-4.3.5/gcc/Function-Attributes.html

    查看属性used

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 2014-06-06
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多