C++的模板类在HotSpot VM中的应用

c++,模板,hotspot,vm,应用 · 浏览次数 : 7

小编点评

**模板类** 模板类是一种可以泛化于多种类型的新类模板。模板类以模板关键字开始,后面跟着模板参数列表。模板参数可以是任何类型,包括基本类型、自定义类型和引用类型。 **BasicHashtable 类** BasicHashtable 是一个模板类,用于实现 Hash 表。它继承自 `CHeapObj` 类,并定义了 `bucket()` 函数,用于计算元素的哈希值。 **HashTable 类** HashTable 是一个基于 `BasicHashtable` 的模板类,它用于实现 Hash 表。它继承自 `BasicHashtable`,并通过 `class` 关键字定义了一个模板类型参数 `T`,表示要存储的元素的类型。 **SymbolTable 类** SymbolTable 是一个基于 `Hashtable` 的模板类,它用于存储 Java 类。它继承自 `Hashtable`,并通过 `class` 关键字定义了一个模板类型参数 `T`,表示要存储的类类型。 **Dictionary 类** Dictionary 是一个基于 `TwoOopHashtable` 的模板类,它用于存储 Java 类字典。它继承自 `TwoOopHashtable`,并通过 `class` 关键字定义了一个模板类型参数 `T`,表示要存储的类类型。

正文

模板是c++的一种特性,允许函数或者类通过泛型(generic types)的形式表现或者运行。模板可以使得函数或类在对应不同的类型(types)的时候正常工作,而无需为每一种类型分别写一份代码。

在HotSpot VM中定义了一些模板类,有了这些模板类,我们就可以和Java一样进行泛型编程。HotSpot VM中定义了Dictionary和SymbolTable等用来存储类和字符串等内容的Hash表,这些容器类都使用到了模板类。

看一下具体的定义,如下:

源代码位置:/media/mazhi/sourcecode/workspace/projectjava9/learnhotspot/src/utilities/hashtable.hpp

template <MEMFLAGS F> class BasicHashtable : public CHeapObj<F> {
  ...
private:
  int               _table_size;
  HashtableBucket<F>*     _buckets;

  BasicHashtableEntry<F>* bucket(int i);
  ...
 }

template <MEMFLAGS F> class BasicHashtableEntry : public CHeapObj<F> {
private:
  unsigned int         _hash;          
  BasicHashtableEntry<F>* _next;
  ...
}

定义了一个名称为BasicHashtable的类模板,类模板以template关键字开始,后面跟着模板参数列表。这里在模板中定义了一个非类型参数,一个非类型参数表示一个值而不是一个类型。它的定义如下:

typedef unsigned short MEMFLAGS;

其定义的非类型参数F也应用到了类模板HashtableBucket<F>中了,同样也可以应用到函数的参数和返回类型中。

通过BasicHashtable这个类模板的定义可以看出,通过此类模板生成的表或字典是通过列表来解决Hash冲突的。

下面接着看另外一个类模板,如下:

源代码位置:/media/mazhi/sourcecode/workspace/projectjava9/learnhotspot/src/utilities/hashtable.hpp

template <class T, MEMFLAGS F> class Hashtable : public BasicHashtable<F> {
 protected:
   ...
   HashtableEntry<T, F>* bucket(int i) {
     return (HashtableEntry<T, F>*)BasicHashtable<F>::bucket(i);
   }
}

template <class T, MEMFLAGS F> class HashtableEntry : public BasicHashtableEntry<F> {
private:
  T  _literal;   // ref to item in table.
  ...
}

这次的类模板继承了BasicHashtable<F>,不过这个类模板中通过class关键字定义了一个模板类型参数T,这其实就是我们要真正往Hash表中存储的元素的类型。

SymbolTable和StringTable都使用了如上的类模板,如SymbolTable类的定义如下:

class SymbolTable : public Hashtable<Symbol*, mtSymbol> {
...
}

为类型模板参数指定了具体的类型。也就是这个Hash表中存储的元素类型为Symbol*,而在为这些元素分配内存时,将这些内存统计到mtSymbol上,这样NMT就能追踪这一部分使用内存的详细信息了。

下面看一下存储类的字典的定义,如下:

template <class T, MEMFLAGS F> class TwoOopHashtable : public Hashtable<T, F> {
...
}

class Dictionary : public TwoOopHashtable<Klass*, mtClass> {
...
}

存储Java类的字典Dictionary继承了TwoOopHashtable<Klass*,mtClass>,这是因为在Java世界中,只有类全名和类加载器才能唯一表示一个类,所以继承这个类也起到了一个见名知义的效果。

另外还有一点需要说明,就是C++对模板的分离式编译很弱。对于 BasicHashtable 中定义的bucket()函数来说,其实现是在hashtable.cpp文件中,其实严格来说,这不是函数的定义,而是生成定义的一种方案,只有在实例化时,才能生成函数定义,所以我们能在hashtable.cpp文件中看到如下类似的语句:

template class BasicHashtable<mtSymbol>;

在.cpp文件的末尾加上如上代码来显式实例化,这样我们将hashtable.cpp作为源文件加入编译时,整个程序就有了模板的显式实例化,即函数定义。否则可能报"undefined reference to"相关的错误。

本人最近准备出一个手写Hotspot VM的课程,超级硬核,从0开始写HotSpot VM,将HotSpot VM所有核心的实现全部走一遍,如感兴趣,加我速速入群。

群里可讨论虚拟机和Java性能剖析与故障诊断等话题,欢迎加入。

 

 

 

  

 

与C++的模板类在HotSpot VM中的应用相似的内容:

C++的模板类在HotSpot VM中的应用

模板是c++的一种特性,允许函数或者类通过泛型(generic types)的形式表现或者运行。模板可以使得函数或类在对应不同的类型(types)的时候正常工作,而无需为每一种类型分别写一份代码。 在HotSpot VM中定义了一些模板类,有了这些模板类,我们就可以和Java一样进行泛型编程。Hot

深度解读《深度探索C++对象模型》之数据成员的存取效率分析(二)

C++对象在经过类的封装后,存取对象中的数据成员的效率是否相比C语言的结构体访问效率要低下?本篇将从C++类的不同定义形式来一一分析C++对象的数据成员的访问在编译器中是如何实现的,以及它们的存取效率如何?

9.1 C++ STL 排序、算数与集合

C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法。在STL中,排序、算数和集合算法是常用的功能,可以帮助我们对数据进行排序、统计、查找以及集合操作等。STL提供的这些算法,能够满足各种数据处理和分析的需求。通过灵活使用这些算法,我们可以高效地对数据进行排序、查找和聚合操作,提高代码的性能和

10.1 C++ STL 模板适配与迭代器

STL(Standard Template Library)标准模板库提供了模板适配器和迭代器等重要概念,为开发者提供了高效、灵活和方便的编程工具。模板适配器是指一组模板类或函数,它们提供一种适配机制,使得现有的模板能够适应新的需求。而迭代器则是STL中的令一种重要的概念,它是一个抽象化的数据访问机制,通过迭代器可以遍历STL容器中的元素。适配器与迭代器两者的紧密配合,使得开发者能够高效地处理容器

7.1 C++ STL 非变易查找算法

C++ STL 中的非变易算法(Non-modifying Algorithms)是指那些不会修改容器内容的算法,是C++提供的一组模板函数,该系列函数不会修改原序列中的数据,而是对数据进行处理、查找、计算等操作,并通过迭代器实现了对序列元素的遍历与访问。由于迭代器与算法是解耦的,因此非变易算法可以广泛地应用于各种容器上,提供了极高的通用性和灵活性。

Boost程序库完全开发指南:1-开发环境和构建工具

Boost官方于2019年12月发布的1.72版编写,共包含160余个库/组件,涵盖字符串与文本处理、容器、迭代器、算法、图像处理、模板元编程、并发编程等多个领域,使用Boost,将大大增强C++的功能和表现力。环境:Windows 10,WSL2,Ubuntu 20.04 LTS,Rider(WS

11.1 C++ STL 应用字典与列表

C++ STL 标准模板库提供了丰富的容器和算法,这些模板可以灵活组合使用,以满足不同场景下的需求。本章内容将对前面学习的知识进行总结,并重点讲解如何灵活使用STL中的vector和map容器,以及如何结合不同的算法进行组合。通过灵活组合使用这些容器和算法,能够满足不同场景下的需求,实现高效的数据处理和操作。STL的设计思想是将数据结构和算法进行分离,使得开发者能够更加专注于解决问题,提高了代码的

【知识点】深入浅出STL标准模板库

本文全面介绍了C++标准模板库(STL)的基础知识,涵盖了容器、算法和迭代器的概念及其常见应用,旨在帮助读者掌握STL的基本用法和重要概念。

用现代C++写一个python的简易型list

std::variant介绍:en.cppreference.com/w/cpp/utility/variant 通过泛型模板(仅提供了int, double, string三种类型的存储),实现了append, pop, front, back, size等方法,并且通过重载运算符实现了对负数索引

MongoDB基础知识梳理

简介 MongoDB 是由 C++ 编写的开源 NoSQL 和基于文档的数据库。MongoDB 提供了面向文档的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常流行的文档类型数据库。 MongoDB 是非关系型数据库当中功能最丰富,最像关系型数据库的