在哪里可以找到 C++ 中的模板实例 [重复]

问题描述 投票:0回答:1

我正在研究 C++ 中的模板实例化过程 - 显式实例化声明和定义。浏览了几篇文章和文档后,我意识到需要显式实例化声明来避免在编译期间进行冗余模板实例化。

有没有办法用冗余模板实例重现行为并在某个地方找到它们看看?

我尝试在有和没有外部模板声明的情况下编译下面的代码。但是当我反编译

.obj
文件时(反编译使用这个https://dogbolt.org/?id=16d5a9f7-b73e-4de9-b4d1-d121d70e33b1#Hex-Rays=97&Ghidra=473&BinaryNinja=91),我没有找不到一个
ATest
会被实例化两次或更多的地方(也许我错过了它,因为我不太了解反编译的代码)。我什至不确定这是正确的地方。

//TestA.h
template <typename T, T val>
struct ATest {
    ATest();
    T foo();
    T bar();
};
//extern template struct ATest<int, 55>;
//extern template ATest<int, 55>::ATest(void);
//extern template int ATest<int, 55>::foo(void);
//extern template int ATest<int, 55>::bar(void);
//TestA.cpp
#include <iostream>
#include "TestA.h"

template <class T, T val>
T ATest<T, val>::foo(void) {
    std::cout << "Hello from foo" << std::endl;
    return val;
}

template <class T, T val>
T ATest<T, val>::bar(void) {
    std::cout << "Hello from bar" << std::endl;
    return val;
}

template <class T, T val> ATest<T, val>::ATest(void) {
    std::cout << "Hello from A()" << std::endl;
}

template struct ATest<int, 55>;
template ATest<int, 55>::ATest(void);
template int ATest<int, 55>::foo(void);
template int ATest<int, 55>::bar(void);
//MainA.cpp
#include "TestA.h"

int main()
{
    ATest<int, 55> a;
    ATest<int, 55> b;
    ATest<int, 55> c;
    ATest<int, 55> d;
    ATest<int, 55> e;
    ATest<int, 55> f;
    ATest<int, 55> g;
    return 0;
}

任何想法将不胜感激。

更新 我的问题已经与此相关为什么模板只能在头文件中实现?我已经阅读了问题和3个第一个答案,但它与我的问题无关

我的问题不是关于如何在标头中使用模板以及为什么可以在 C++ 的标头中实现它们(来自上面指出的帖子)。我问的是模板实例的编译结果。它与

C
语言的关系比该帖子中的内容更多。这就是为什么 stackoverflow 建议我选择我相信的
C
标签。

我在

C++
方面也不是很有经验,所以我的问题可能会让人困惑。对不起。

c++ templates instantiation
1个回答
1
投票

你有点误会了。模板方法不会在单个 .obj 中实例化两次或更多次,因此您不会看到多个

ATest::*
实例化。

如果您不使用

extern template
,那么模板方法将在翻译单元中实例化,因此相同的模板方法和构造在使用模板的所有翻译单元中被实例化两次或更多次。
extern template
指示编译器不要在当前翻译单元中实例化模板方法。

简短的例子

// a.h
template <typename T>
struct A {
  A(T) {}
};
// u1.c
#inlcude "a.h"
A<int> a(1);
// u2.c
#inlcude "a.h"
A<int> a(2);

A<int>::A(int)
在 u1.obj 和 u2.obj 中被实例化两次。然后链接器选择其中一个进入可执行文件。

© www.soinside.com 2019 - 2024. All rights reserved.