C++ 模板中的代码重用(或不重用)

Adr*_*aan 5 c++ templates

到目前为止我读过的所有书籍中,他们都说 C++ 模板为我们使用的每种类型生成一个代码实例。

另一方面,书上说在 C# 中代码是重用的。

因此,我在许多书籍中进行了搜索,并在一本很旧的书中找到了以下 C# 示例。

1) 值类型

List<int> intList1  = new List<int>();
List<int> intList2  = new List<int>();
List<bool> boolList = new List<bool>();
Run Code Online (Sandbox Code Playgroud)

在这种情况下(值类型),编译器为 intList1 和 intList2(相同类型)生成一个代码实例,并为 boolList 生成一个代码实例。

2) 参考类型

List<Dog> dogList1 = new List<Dog>();
List<Dog> dogList2 = new List<Dog>();
List<Cat> catList  = new List<Cat>();
Run Code Online (Sandbox Code Playgroud)

在这种情况下(引用类型),编译器只为dogList1、dogList1和catList生成一个代码实例,因为只要它可以表示指向对象的指针,所有引用类型都可以共享一个实现。

这对我(作为 C++ 开发人员)来说非常清楚,但我对有关 C++ 模板的同样的事情感到好奇。

早在 C# 创建之前,C++ 也有值类型和引用类型。

因此,让我们用 C++ 重写 avove 示例

1) 值类型

vector<int> intList1;
vector<int> intList2;
vector<bool> boolList;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我毫不怀疑 intList1 和 intList2 共享相同的代码,并且 boolList 需要另一个实现

2) 参考类型

vector<Dog *> dogList1;
vector<Dog *> dogList2;
vector<Cat *> catList;
Run Code Online (Sandbox Code Playgroud)

我的问题是:

我是否可以得出结论,在第二种情况(指针向量)中,只要所有向量指针(向量<Dog *>和向量<Cat *>)都共享相同的模板实例化,并且所有指针的大小相同(32或64 位,具体取决于平台)?

Bat*_*eba 4

(您的问题有些混乱,但让我跳过这个问题并解决实际问题)。

不,你不能这样假设。

这主要是因为无论您的系统是 32 位还是 64 位,指针的大小都不一定相同。