如果不在代码中使用,编译器会丢弃 class 实现吗?

Will a compiler discard a class implementation if not used in code?

可能标题有点误导。但在我开始真正的问题之前,让我解释一下我目前所处的情况。

我需要创建几个 class/structure 的特化来帮助我 select 根据指定的模板参数选择正确的类型。这是一个简化的例子:

struct TypeA;
struct TypeB;
struct TypeC;

template < typename T > struct TypeSelector
{
    typedef DefaultType Type;
};

template <> struct TypeSelector< TypeA >
{
    typedef SuggestedForTypeA Type;
};

template <> struct TypeSelector< TypeB >
{
    typedef SuggestedForTypeB Type;
};

template <> struct TypeSelector< TypeC >
{
    typedef SuggestedForTypeC Type;
};

我最终可能会做一些甚至可以嵌套的专业化。

起初,我看看是否可以使用新的 c++11 关键字 using出于好奇)避免这种方法。但显然,它不能用于创建专业化。所以我只剩下这种方法了。

但是,据我了解,滥用这种方法对编译后的代码并不是很好。当我最终为我可能在这些专业化中使用的所有其他类型创建一堆新类型时。

而且我基本上只是将这些类型用作更智能的 typedef 而不是实际创建它们的实例。

所以我的问题是。一个体面的编译器会发现我没有使用这些类型并从编译代码中丢弃它们吗?

或者是否有我可以指定的属性来指示此类行为?

最近的 C++11/14/17 功能不是问题,因为我使用的是 MinGW/GCC 6.1.0

在您的示例中,对于 class 模板,编译器几乎不需要实际实例化。没有成员函数,没有静态成员数据等。除了 RTTI 机制的一些类型信息外,没有任何东西可以在程序执行期间的任何阶段占用 space 或性能。

我不知道有任何可移植的方式告诉编译器"please do not generate any kind of data for this class"。但是,如果我是你,我会很乐意采用这种做法,因为它已经以类型特征的形式在 STL 中广泛使用。添加 class 模板及其专业化的开销可以忽略不计。