gpt4 book ai didi

c++ - 在显式实例化的情况下,类模板的成员函数是否可以内联?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:15:24 26 4
gpt4 key购买 nike

doSth() 是否可以内联给定此配置?

// A.h

template<typename T>
struct A
{
void doSth();
};


// A.cpp

template<typename T>
void A<T>::doSth() { /* do something */ }

template class A<bool>;
template class A<int>;


// main.cpp

#include "A.h"

int main()
{
A<bool> a;
a.doSth();
}

如果答案是否定的,我会在 .tpp 文件中定义我的成员函数,并将其包含在“A.h”的末尾,但是对于 .cpp 文件中的非内联版本,这看起来很奇怪,所以我我想避免这种情况。

最佳答案

大多数编译器无法内联这种代码排列。 ICC 编译器文档声称它支持以一种方式调用,这种方式可以在您首先以不同的方式构建之后,然后收集分析数据,然后将分析数据反馈给跨模块优化构建。我只是做了一些适度的尝试来让它发挥作用,而且它只在游戏规模的项目中起作用,而不是在任何真实的项目中起作用。

为了与普通编译一起使用,你应该为你想要内联的函数定义提供额外的文件,但你可能不应该将它包含在 A.h 的末尾,而是将 A.h 包含在它的开头并将它包含在 select cpp 中真正需要它的文件。

我更喜欢

// A.h
#ifndef A_H
#define A_H
template<typename T>
struct A
{
inline void doSth();
};
#endif

// A.tpp
#ifndef A_TPP
#define A_TPP
#include "A.h"
template<typename T>
inline void A<T>::doSth() { /* do something */ }
#endif

// Various other .h files that need to know what is declared in A
#include "A.h"

// Only cpp files that need what is defined in A.tpp
#include "A.tpp"

我忘记了这个选项以及哪些编译器有这样的选项,但是在 .h 文件中几乎冗余地使用 inline 带有一个编译器选项,说明如果函数被声明为and used and 未定义的方式,抛出编译时错误。

如果没有该选项,链接时间错误将更难阅读,但会告诉您哪个 .cpp 需要包含 .tpp 但错过了。

关于c++ - 在显式实例化的情况下,类模板的成员函数是否可以内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34319452/

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