动态调度在类外部声明的方法
Dynamic dispatch of methods declared outside of classes
我试图理解库实现,但是某些方法动态链接的方式让我感到困惑。我知道使用派生类的对象时的调度机制,但没有对象,我不知道它是如何工作的。我试图理解的库是来自 gcc 的 libitm。
头文件 libitm.h 将所有 ABI 方法声明为顶级方法,周围没有类或结构。对于其中的大多数,我都找到了独特的定义,所以我对它们没有任何疑问,我在这里省略它们。但是下面的摘录显示了 70 种方法的声明,这让我感到困惑。
typedef uint8_t _ITM_TYPE_U1;
typedef uint16_t _ITM_TYPE_U2;
typedef uint32_t _ITM_TYPE_U4;
typedef uint64_t _ITM_TYPE_U8;
typedef float _ITM_TYPE_F;
typedef double _ITM_TYPE_D;
typedef long double _ITM_TYPE_E;
typedef float _Complex _ITM_TYPE_CF;
typedef double _Complex _ITM_TYPE_CD;
typedef long double _Complex _ITM_TYPE_CE;
#define ITM_BARRIERS(T)
extern _ITM_TYPE_##T _ITM_R##T(const _ITM_TYPE_##T *) ITM_REGPARM;
extern _ITM_TYPE_##T _ITM_RaR##T(const _ITM_TYPE_##T *) ITM_REGPARM;
extern _ITM_TYPE_##T _ITM_RaW##T(const _ITM_TYPE_##T *) ITM_REGPARM;
extern _ITM_TYPE_##T _ITM_RfW##T(const _ITM_TYPE_##T *) ITM_REGPARM;
extern void _ITM_W##T (_ITM_TYPE_##T *, _ITM_TYPE_##T) ITM_REGPARM;
extern void _ITM_WaR##T (_ITM_TYPE_##T *, _ITM_TYPE_##T) ITM_REGPARM;
extern void _ITM_WaW##T (_ITM_TYPE_##T *, _ITM_TYPE_##T) ITM_REGPARM;
ITM_BARRIERS(U1)
ITM_BARRIERS(U2)
ITM_BARRIERS(U4)
ITM_BARRIERS(U8)
ITM_BARRIERS(F)
ITM_BARRIERS(D)
ITM_BARRIERS(E)
ITM_BARRIERS(CF)
ITM_BARRIERS(CD)
ITM_BARRIERS(CE)
在文件中 dispatch.h 中声明了一个结构abi_dispatch,它用作 TM 算法特定调度的基础。在此结构中,上述 70 个方法的声明是作为纯虚拟方法进行的。以下摘录显示了方法和结构的宏定义。
#define ITM_READ_M(T, LSMOD, M, M2)
M _ITM_TYPE_##T ITM_REGPARM ITM_##LSMOD##T##M2 (const _ITM_TYPE_##T *ptr)
{
return load(ptr, abi_dispatch::LSMOD);
}
#define ITM_READ_M_PV(T, LSMOD, M, M2)
M _ITM_TYPE_##T ITM_REGPARM ITM_##LSMOD##T##M2 (const _ITM_TYPE_##T *ptr)
= 0;
#define ITM_WRITE_M(T, LSMOD, M, M2)
M void ITM_REGPARM ITM_##LSMOD##T##M2 (_ITM_TYPE_##T *ptr,
_ITM_TYPE_##T val)
{
store(ptr, val, abi_dispatch::LSMOD);
}
#define ITM_WRITE_M_PV(T, LSMOD, M, M2)
M void ITM_REGPARM ITM_##LSMOD##T##M2 (_ITM_TYPE_##T *ptr,
_ITM_TYPE_##T val)
= 0;
#define CREATE_DISPATCH_METHODS_T(T, M, M2)
ITM_READ_M(T, R, M, M2)
ITM_READ_M(T, RaR, M, M2)
ITM_READ_M(T, RaW, M, M2)
ITM_READ_M(T, RfW, M, M2)
ITM_WRITE_M(T, W, M, M2)
ITM_WRITE_M(T, WaR, M, M2)
ITM_WRITE_M(T, WaW, M, M2)
#define CREATE_DISPATCH_METHODS_T_PV(T, M, M2)
ITM_READ_M_PV(T, R, M, M2)
ITM_READ_M_PV(T, RaR, M, M2)
ITM_READ_M_PV(T, RaW, M, M2)
ITM_READ_M_PV(T, RfW, M, M2)
ITM_WRITE_M_PV(T, W, M, M2)
ITM_WRITE_M_PV(T, WaR, M, M2)
ITM_WRITE_M_PV(T, WaW, M, M2)
#define CREATE_DISPATCH_METHODS(M, M2)
CREATE_DISPATCH_METHODS_T (U1, M, M2)
CREATE_DISPATCH_METHODS_T (U2, M, M2)
CREATE_DISPATCH_METHODS_T (U4, M, M2)
CREATE_DISPATCH_METHODS_T (U8, M, M2)
CREATE_DISPATCH_METHODS_T (F, M, M2)
CREATE_DISPATCH_METHODS_T (D, M, M2)
CREATE_DISPATCH_METHODS_T (E, M, M2)
CREATE_DISPATCH_METHODS_T (CF, M, M2)
CREATE_DISPATCH_METHODS_T (CD, M, M2)
CREATE_DISPATCH_METHODS_T (CE, M, M2)
#define CREATE_DISPATCH_METHODS_PV(M, M2)
CREATE_DISPATCH_METHODS_T_PV (U1, M, M2)
CREATE_DISPATCH_METHODS_T_PV (U2, M, M2)
CREATE_DISPATCH_METHODS_T_PV (U4, M, M2)
CREATE_DISPATCH_METHODS_T_PV (U8, M, M2)
CREATE_DISPATCH_METHODS_T_PV (F, M, M2)
CREATE_DISPATCH_METHODS_T_PV (D, M, M2)
CREATE_DISPATCH_METHODS_T_PV (E, M, M2)
CREATE_DISPATCH_METHODS_T_PV (CF, M, M2)
CREATE_DISPATCH_METHODS_T_PV (CD, M, M2)
CREATE_DISPATCH_METHODS_T_PV (CE, M, M2)
struct abi_dispatch
{
public:
enum ls_modifier { NONTXNAL, R, RaR, RaW, RfW, W, WaR, WaW };
public:
CREATE_DISPATCH_METHODS_PV(virtual, )
}
例如,abi_dispatch的派生结构可以在method-ml或method-gl中找到。他们使用 CREATE_DISPATCH_METHODS(virtual, ( 和上述宏来生成 70 个读/写方法,并将它们映射到加载/存储模板函数。
我最大的问题是:运行时系统如何知道在调用其中一个库函数时应该使用哪个方法定义(method-gl 或 method-ml 中的定义(?在读/写方法的定义中,没有提到abi_dispatch对象。线程本地存储中存在一个 abi-dispatch 对象,但我不知道它如何与此相适应。
谢谢你的帮助。
找到缺少的链接。
还有另一个宏 (CREATE_DISPATCH_FUNCTIONS(,它从上面定义 70 个函数声明,并在调度对象中调用相应的方法。
相关文章:
- 将子类方法声明为基类的友元
- 模板中的模板方法 - 实例声明和类方法声明签名不同
- C++ C# 中的方法声明
- 使用gtest将所有方法声明为virtual以进行mocking
- 方法声明 c++ 后的引用符号
- 标题C 中的静态类方法声明
- 接口定义中的方法声明
- 如何在没有显式方法声明的情况下返回值
- C 类方法声明返回错误
- C++ dll 导入 VBA(Excel) 与方法声明"_Something"
- 查找没有定义的方法声明
- 只要调用的函数是用constexpr指定的,就将委托方法声明为constexpr
- mat类opencv中的begin()方法声明
- C++受模板方法声明影响的名称查找
- 我可以在Visual Studio 2012中将方法声明为朋友吗?
- 类中方法声明的顺序是否对编译器很重要
- 静态方法声明但未定义错误c++
- 错误:在类方法声明中无效地使用void表达式
- 奇怪的c++语法方法声明
- 类方法声明中的 decltype:在声明成员之前使用时出错"referenced"