gpt4 book ai didi

c++ - 是否为未使用的模板类方法生成目标代码?

转载 作者:可可西里 更新时间:2023-11-01 14:57:28 26 4
gpt4 key购买 nike

我有一个 C++ 模板类,它使用 3 个不同类型的参数进行实例化。该类只需要为其中一种类型提供一种方法,并且永远不会为其他两种类型调用该方法。

该方法的目标代码会生成三次(对于实例化模板的所有类型),还是只生成一次(对于实际使用它的类型)?

最佳答案

虚成员函数在实例化类模板时实例化,而非虚成员函数只有在调用时才实例化。

这包含在 C++ 标准的 [temp.inst] 中(在 C++11 中,这是 §14.7.1/10。在 C++14 中,它是 §14.7.1/11,在 C 中++17 是 §17.7.1/9。摘自下面的 C++17)

An implementation shall not implicitly instantiate a function template, a variable template, a member template, a non-virtual member function, a member class, a static data member of a class template, or a substatement of a constexpr if statement (9.4.1), unless such instantiation is required

另请注意,即使某些成员函数对于给定的模板参数不可实例化,也可以实例化类模板。例如:

template <class T>
class Xyzzy
{
public:
void CallFoo() { t.foo(); } // Invoke T::foo()
void CallBar() { t.bar(); } // Invoke T::bar()

private:
T t;
};

class FooBar
{
public:
void foo() { ... }
void bar() { ... }
};

class BarOnly
{
public:
void bar() { ... }
};

int main(int argc, const char** argv)
{
Xyzzy<FooBar> foobar; // Xyzzy<FooBar> is instantiated
Xyzzy<BarOnly> baronly; // Xyzzy<BarOnly> is instantiated

foobar.CallFoo(); // Calls FooBar::foo()
foobar.CallBar(); // Calls FooBar::bar()

baronly.CallBar(); // Calls BarOnly::bar()

return 0;
}

这是有效的,即使 Xyzzy::CallFoo() 不可实例化,因为没有 BarOnly::foo() 这样的东西。此功能经常用作模板元编程工具。

但是请注意,模板的“实例化”与生成多少目标代码没有直接关系。这将取决于您的编译器/链接器实现。

关于c++ - 是否为未使用的模板类方法生成目标代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/183108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com