类型的 GUID(全局唯一标识符) 是在 COM 编程(Component Object Model) 和某些大型 C++ 架构(如 Office、DirectX、跨 DLL 接口)中关联类型信息实现运行时类型识别与动态接口查询的重要机制。
下面我们分层解释——

类型的 GUID 是什么?

GUID(Globally Unique Identifier):128 位的唯一标识,用来唯一标识某种类型(接口/类)
比如:

__declspec(uuid("4D675322-F6F5-4E85-94EF-2927DFAA1409"))
struct IWorkerCallback : IUnknown { ... };

这个 GUID 表示:IWorkerCallback 类型的唯一身份标识是这个字符串值

GUID 的用途:为什么类型需要它?

1. COM 接口查询(核心用途)

COM 是基于接口的架构,组件之间只能通过接口通信。你不能像 C++ 的 dynamic_cast 那样直接转换接口指针,所以需要:

HRESULT QueryInterface(const IID& iid, void** out);

你必须提供要“转换到的接口”的 IID(也就是接口的 GUID),比如:

pUnknown->QueryInterface(__uuidof(IMyInterface), (void**)&pMyInterface);

这背后的意思是:我想知道你是否实现了 IMyInterface,请给我这个接口指针,如果有的话。

2. 替代 RTTI:无需开启 -frtti

  • 有些大型项目(如 Office)**禁用了 RTTI(运行时类型信息)**以节省空间。
  • 通过 GUID,我们就能在运行时识别类型、接口并动态转换,而不用启用 C++ 的原生 typeiddynamic_cast

3. 跨 DLL 类型识别

在 Windows DLL 边界上,类型信息是不能直接共享的,但 GUID 可以。于是:

  • DLL A 定义了 IFoo
  • DLL B 想和它通信,只要知道 IFoo 的 GUID 就行了,无需包含 IFoo 的完整实现。

4. 插件机制和反射支持

如果你要构建:

  • 跨平台插件框架
  • 脚本调用(如 Lua → C++)
  • 元数据反射(识别支持的功能)
    你也可以使用类型 GUID 来:
  • 注册所有类型
  • 用 GUID 映射构造函数、工厂函数、接口表
  • 甚至用于序列化/反序列化(type-safe)

不是 C++ 标准的机制

GUID 和 __uuidof() 不是 C++ 标准提供的功能,而是:

  • Microsoft Visual C++ 提供的扩展(__declspec(uuid)
  • Clang/GCC 等可以通过宏和模板模拟(如你前面看到的 STRUCT_GUID

举个实际例子

IUnknown* p = ...;
IFoo* foo = nullptr;
if (SUCCEEDED(p->QueryInterface(__uuidof(IFoo), (void**)&foo))) {foo->DoSomething();
}

没有 GUID,你就无法调用 QueryInterface();类型系统没法知道“你到底想要哪个接口”。

总结一句话:

类型的 GUID 是类型在运行时的身份证,它是 COM 等架构中实现接口查询(QueryInterface)、替代 RTTI、支持插件与 DLL 通信的核心机制。

总结一下为什么需要类型的 GUID:

  • GUID(全局唯一标识符)用于标识接口类型,特别是在 COM(组件对象模型)编程中,比如 Microsoft Office 里的代码。
  • 通过 IUnknown::QueryInterface 方法,可以根据 GUID 实现接口的动态查询和类型转换(类似于动态类型转换,但不依赖于 C++ 的 RTTI)。
  • Office 里不使用 C++ 标准的 RTTI,而是用 GUID 来保证跨模块、跨语言的一致性和安全性。
  • Visual C++ 提供了对 GUID 的内置支持,通过 __declspec(uuid("...")) 来声明 GUID,通过 __uuidof(Type) 获取类型对应的 GUID。
  • C++ 标准并没有内建对 GUID 的支持,所以这是 Microsoft 平台特有的扩展。

这段代码展示了一个跨平台(特别是支持 MSVC 和 Clang 编译器)对 GUID 与接口类型关联的典型写法,核心点如下:

  • __declspec(uuid("...")) 是 MSVC 特有的语法,用于给接口(如 IWorkerCallback)附加 GUID。
  • 在 MSVC 下,__uuidof(type) 可以直接获取这个 GUID。
  • Clang 编译器不支持 __declspec(uuid) 的模板特化,所以采用模板特化结构体 guid_of<type> 来手动绑定 GUID。
  • 通过宏 #define __uuidof(type) guid_of<type>::value,无论在哪个编译器环境,都能统一用 __uuidof(type) 方式获取 GUID。
  • 这样写能实现跨编译器一致访问 GUID,同时保证代码跨平台兼容。

总结一下这个理想方案的问题点:

  • [uuid(“…”)] 标注虽然写起来直观简洁,
  • 但它是 微软专有扩展,不属于标准 C++,只能在 Visual C++ 使用
  • 其实现会在对象实例中增加额外指针,导致对象体积变大
  • 这对性能敏感或跨平台项目是不友好的。
    所以,虽然它“看上去理想”,但实际用时要慎重,最好还是用兼容性更好、对实例大小无影响的传统 __declspec(uuid(...)) + 模板特化方案。

总结一下这个用宏简化 GUID 绑定的关键点:

  • 宏写成 STRUCT_GUID(IWorkerCallback, "4D675322-F6F5-4E85-94EF-2927DFAA1409") 形式,
    宏只负责绑定 GUID,不包含 structclass 关键字,
    这样更利于 IDE 和工具解析代码(语法高亮、跳转等)。
  • structclass 关键字放在宏外写,方便代码风格统一和工具支持。
  • 注意宏绑定的 GUID 必须和类型的声明匹配,比如不能宏里用 class,类型定义里用 struct,否则会产生 Visual C++ 的 Level 1 警告。
  • 保证这点对 Visual C++ 的 ABI 稳定性很重要,避免潜在兼容性问题。

How can we implement the STRUCT_GUID macro?

这段代码意思是:

#define STRUCT_GUID(type, guidString) \struct __declspec(uuid(guidString)) type;
  • 这个宏利用 Visual C++ 的 __declspec(uuid(...)) 特性直接把 GUID 绑定到 struct 上。
  • 宏只负责给类型添加 GUID 属性,不管是定义、前置声明还是重新声明,都可以使用这个宏。
  • 实现非常简单明了,使用方便。
    比如:
STRUCT_GUID(IWorkerCallback, "4D675322-F6F5-4E85-94EF-2927DFAA1409")
struct IWorkerCallback : IUnknown {virtual void Invoke(IWorkerObject* pObj) = 0;
};

这样,IWorkerCallback 类型就绑定了对应的 GUID,VC++ 编译器会自动生成相关信息。

这段描述是 Clang 下跨平台实现 GUID 关联的思路,主要点如下:

核心思想

  • 不像 VC++ 直接用 __declspec(uuid(...)),Clang 没有类似的内建支持,需要用模板和函数来“模拟” GUID 关联。
  • 定义一个模板结构体 guid_of<T>,它有一个 static constexpr GUID value,存储对应类型的 GUID。
  • __uuidof(type) 宏映射到 guid_of<type>::value,这样用起来语义一致。

关键实现细节

// 默认模板,调用 get_guid 函数
template<typename T>
struct guid_of {static constexpr GUID value = get_guid(static_cast<T*>(nullptr));
};
// 默认 get_guid 函数实现,static_assert 防止未特化情况导致使用错误
template<typename T>
constexpr GUID get_guid(T*) {static_assert(sizeof(T) == 0, "GUID not defined for this type!");
}
// 用宏定义类型的 GUID,宏展开成 get_guid 函数的特化版本
#define STRUCT_GUID(type, guidString)             \struct type;                                 \extern "C++" constexpr GUID get_guid(type*) noexcept { \return str_to_guid(guidString);          \}
  • STRUCT_GUID(type, guidString) 会先声明一个 struct type,再定义一个针对该类型指针的 get_guid 函数特化,返回对应的 GUID。
  • 通过 str_to_guid 将字符串形式的 GUID 转换为 GUID 结构。
  • 当你调用 __uuidof(type) 时,实际是访问 guid_of<type>::value,编译器会调用对应的 get_guid(type*),返回正确的 GUID。
  • 如果没有使用 STRUCT_GUID 定义的类型,调用 __uuidof 会触发 static_assert,提示没有定义 GUID。

优点

  • 支持 Clang 以及非 VC++ 编译器。
  • 类型安全,调用时若未定义 GUID 会报错。
  • 不改变结构体大小或内存布局。

你提供的这段代码是对 Clang 下如何在 C++ 中实现编译期 GUID(全局唯一标识符)解析 的继续部分。下面是对这段实现的完整讲解:

/// 表示一个不带花括号的 GUID 字符串,格式为 "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"
typedef char GuidString[37];
/// 把十六进制的 ASCII 字符转换为无符号整数值(0–15)
/// H2U['0'] = 0, H2U['9'] = 9, H2U['A'] = 10, H2U['F'] = 15, H2U['a'] = 10, H2U['f'] = 15
const unsigned char H2U[256] = {0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,0, 0, 0, 0, 0, 0, 0, 10, 11, 12, 13, 14, 15, 0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 0, 0, 0, 0, 0, 0, 0,
};
/// 将格式为 "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" 的字符串在编译期转换为 GUID 结构
constexpr GUID str_to_guid(const GuidString& g) noexcept {return {// 第1段(8位十六进制)→ unsigned longstatic_cast<unsigned long>((H2U[g[0]] << 28) | (H2U[g[1]] << 24) | (H2U[g[2]] << 20) |(H2U[g[3]] << 16) | (H2U[g[4]] << 12) | (H2U[g[5]] << 8) |(H2U[g[6]] << 4)  | H2U[g[7]]),// 第2段(4位十六进制)→ unsigned shortstatic_cast<unsigned short>((H2U[g[9]] << 12) | (H2U[g[10]] << 8) |(H2U[g[11]] << 4) | H2U[g[12]]),// 第3段(4位十六进制)→ unsigned shortstatic_cast<unsigned short>((H2U[g[14]] << 12) | (H2U[g[15]] << 8) |(H2U[g[16]] << 4) | H2U[g[17]]),// 第4和第5段(4位 + 12位十六进制)→ 8字节 unsigned char[8]{static_cast<unsigned char>((H2U[g[19]] << 4) | H2U[g[20]]),static_cast<unsigned char>((H2U[g[21]] << 4) | H2U[g[22]]),static_cast<unsigned char>((H2U[g[24]] << 4) | H2U[g[25]]),static_cast<unsigned char>((H2U[g[26]] << 4) | H2U[g[27]]),static_cast<unsigned char>((H2U[g[28]] << 4) | H2U[g[29]]),static_cast<unsigned char>((H2U[g[30]] << 4) | H2U[g[31]]),static_cast<unsigned char>((H2U[g[32]] << 4) | H2U[g[33]]),static_cast<unsigned char>((H2U[g[34]] << 4) | H2U[g[35]])}};
}

目的

Clang 不支持 __declspec(uuid(...)),所以我们自己构建一种方式,在 编译期将字符串形式的 GUID 解析为结构体形式(即 GUID{...}),以便类型绑定使用。

关键元素解释

1. GuidString 类型定义

typedef char GuidString[37];
  • 用于表示标准 GUID 格式的字符串 "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"(共 36 个字符 + 终止符)。
  • 格式示例:"4D675322-F6F5-4E85-94EF-2927DFAA1409"

2. H2U 十六进制字符转换表

const unsigned char H2U[256] = { ... };
  • '0''9''A''F''a''f' 转换为 015
  • 例如:H2U['A'] == 10H2U['f'] == 15
  • 其它值都默认为 0,避免非 hex 字符崩溃。

3. str_to_guid:将字符串转为 GUID

constexpr GUID str_to_guid(const GuidString& g) noexcept
工作流程(按 GUID 各字段分段解释):
// DWORD Data1 = 8 hex digits: g[0] - g[7]
(H2U[g[0]] << 28) | (H2U[g[1]] << 24) | ... | H2U[g[7]]
// WORD Data2 = 4 hex digits: g[9] - g[12]
(H2U[g[9]] << 12) | ... | H2U[g[12]]
// WORD Data3 = 4 hex digits: g[14] - g[17]
(H2U[g[14]] << 12) | ... | H2U[g[17]]
// BYTE Data4[8] = 16 hex digits: g[19]–g[36]
(g[19], g[20]), (g[21], g[22]), ... (g[34], g[35])
  • 每一对十六进制字符被解析为一个字节。
  • 中间的 - 符号被跳过(g[8], g[13], g[18], g[23] 是 -)。
  • 因此,整段是一个无分支、常量求值的 GUID 解析器!

总结理解

  • 这段代码的目的是为了让你能用字符串定义 GUID,但 在编译期就能将字符串转化为真实的 GUID 对象
  • 配合前面提到的 STRUCT_GUIDget_guid() 机制,就可以对任意类型 T 实现 __uuidof(T) 的能力,跨平台兼容。
  • 这种实现方式 既不依赖 RTTI,也不增加对象大小,且可静态验证和优化

这段内容是 Clang 下使用 __uuidof()GUID编译期模拟实现方案的延续,解释了 str_to_guid() 机制的工作方式、潜在限制和一些高级用法。下面是逐条解释:

理解要点

str_to_guid()constexpr

constexpr GUID str_to_guid(const GuidString& g) noexcept;
  • 这是一个编译期函数,所以只要传入的是字符串常量,就能在编译时生成 GUID 实例
  • 可用于 constexpr GUID value = str_to_guid("..."),不会有运行时代价。

get_guid() 依赖于 ADL(Argument-Dependent Lookup)

template<typename T>
constexpr GUID get_guid(T*);
  • 它通过 实参依赖查找 来解析 get_guid()
  • 所以这个函数必须定义在和类型 T 同一个命名空间下。
  • 否则 get_guid(T*) 找不到合适的定义,触发 static_assert() 编译错误(这个是特意设计的安全机制)。

若类型未定义 GUID,会报错

template<typename T>
constexpr GUID get_guid(T*) {static_assert(false, "Type has no GUID.");
}
  • 这是故意设计的“fail early”机制。
  • 目的是让开发者在使用 __uuidof(T)必须先注册 GUID,否则就失败。

限制和已知问题

仅适用于 C++11

  • 这套方案依赖 C++11 的 constexpr 和模板机制。
  • 不兼容更早的标准(如 C++03)。

NDK 链接器问题(在 Android 开发中)

NDK linker error when __uuidof() is used as a template parameter

具体问题:

template<typename C, const IID* piid = &__uuidof(C)> class QIPtr;
  • 在某些平台(如 Android NDK),__uuidof() 的地址值不能用于模板非类型参数
  • 原因:链接器无法静态推导 &__uuidof(C) 的地址。

替代方案:使用 resolve_guid_ptr<C, piid>::guid

解决方法:

template<typename C, const IID* piid = nullptr>
class QIPtr {static constexpr const GUID* guid = resolve_guid_ptr<C, piid>::guid;
};
  • 提供一个 resolve_guid_ptr 模板:
    • 如果显式提供 piid,就用它。
    • 如果为 nullptr,就自动使用 __uuidof(C)
      这个模式使用了 偏特化/特化技巧 来绕开链接器问题。

总结

这套 Clang 下的 GUID 实现机制的关键点是:

特性说明
str_to_guid()编译期解析 GUID 字符串为结构体。
get_guid() + ADL自动查找对应类型的 GUID。如果没有定义,则编译失败。
Clang 支持跨平台 __uuidof通过 #define __uuidof(type) guid_of<type>::value 实现替代。
NDK 问题的解决使用 resolve_guid_ptr 延迟和间接获取 GUID 地址,绕过链接器限制。

对整套跨平台 GUID 关联机制的总结性说明,下面是它的要点解析和中文理解:

总结理解

STRUCT_GUID 的作用

STRUCT_GUID 允许在多个平台(如 VC++ 和 Clang)上将字符串形式的 GUID 与类型关联。

  • 在 Visual C++ 下,使用 __declspec(uuid("..."))
  • 在 Clang 下,通过 get_guid()str_to_guid() 编译期计算 GUID。
  • 它本质上是一个跨平台的类型→GUID映射工具

保持与旧代码兼容

可以继续使用 __uuidof()

  • __uuidof(T) 在 Visual C++ 是内建的。
  • 在 Clang 中通过 #define __uuidof(type) guid_of<type>::value 来兼容。
  • 所以老代码无需修改,新的平台仍然能运行。

这个技巧还能用于其他自定义类型属性

不局限于 GUID,你还可以用类似方式为类型添加其他属性,如:

  • 类型标签(tag)
  • 分类信息(traits)
  • 序列化 ID 等等

如何实现一个通用机制

  1. 定义一个宏(比如 STRUCT_GUID)来注入属性信息。
  2. 宏会展开成一个 constexpr 函数,返回这个属性值。
  3. 提供一个访问接口类或模板(如 guid_of<T>::value)。
  4. 提供一个默认模板函数(当类型未定义该属性时触发 static_assert,或返回默认值)。

中文总结一句话:

使用 STRUCT_GUID 技术,我们可以为类型编译期地绑定 GUID 或其他自定义属性,支持多平台编译器(如 VC++、Clang),且对旧代码兼容良好。这个机制也能扩展到任意类型属性的静态绑定,是一种强大且通用的元编程手法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/907980.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/907980.shtml
英文地址,请注明出处:http://en.pswp.cn/news/907980.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 11以上App主动连接WIFI的完整方案

早期Android版本App内连接指定的WIFI还是比较简单的&#xff0c;但是随着Android版本的提升&#xff0c;限制也越来越多。以下是一套完整的Android 11以上的WIFI应用内主动连接方案。 第一步&#xff1a;添加到建议连接&#xff1a; val wifiManager getSystemService(WIFI_…

让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作

让AI弹琴作曲不再是梦:Python+深度学习玩转自动化音乐创作 一、AI也能谱出动人的旋律?真不是科幻! 还记得小时候学钢琴时老师的那句经典:“感觉不到情绪的乐句,是没灵魂的。” 当时我一边练琴一边想:要是有个机器能帮我写谱、调性又不跑调就好了! 结果几年后,真被我碰…

机器学习:集成学习概念、分类、随机森林

本文目录&#xff1a; 一、集成学习概念**核心思想&#xff1a;** 二、集成学习分类&#xff08;一&#xff09;Bagging集成&#xff08;二&#xff09;Boosting集成(三&#xff09;两种集成方法对比 三、随机森林 一、集成学习概念 集成学习是一种通过结合多个基学习器&#…

YOLO机械臂丨使用unity搭建仿真环境,YOLO算法识别,Moveit2控制

文章目录 前言搭建开发环境在window中安装Unity创建Docker容器&#xff0c;并安装相关软件运行测试改进添加删除节点前的函数调用 报错❌框选节点的时候报错❌如果无法控制机械臂&#xff0c;查看rviz2的终端&#xff0c;应该会有❌规划路径超出范围 参考 前言 本项目介绍通过…

Docker 插件生态:从网络插件到存储插件的扩展能力解析

Docker 容器技术以其轻量、快速、可移植的特性,迅速成为构建和部署现代应用的核心工具。然而,尽管 Docker Engine 自身功能强大,但在面对多样化的生产环境和复杂业务需求时,仅靠核心功能往往无法满足所有场景。 例如,跨主机的容器网络通信、异构存储系统的持久化数据管理…

飞牛fnNAS使用群辉DSM系统

目录 一、Virtual DSM简介 二、在飞牛NAS中安装 1、激活Docker 2、建立路径 3、创建Compose项目 4、容器启动 (1)构建容器 (2)容器启动 5、查看日志 6、登录DSM地址 7、安装完成 8、安装套件示例 9、远程访问 10、测试 (1)PC浏览器创建笔记 (2)手机创建…

关于FPGA软核的仿真(一)

MicroBlaze是Xilinx专为FPGA设计的软核处理器&#xff0c;其本质是通过FPGA的可编程逻辑资源&#xff08;如查找表LUT、触发器Flip-Flop&#xff09;动态构建的处理器架构&#xff0c;其本质为搭建处理器电路。MicroBlaze上运行嵌入式C代码程序&#xff0c;通过CoreConnect总线…

户外摄像头监控如何兼顾安全实时监控

一、技术手段提升隐私安全性 硬件与功能设计 采用支持隐私保护技术的设备&#xff0c;例如带电子开关的摄像头&#xff08;可远程控制摄像头启闭&#xff09;3&#xff0c;或搭载本地AI算法的设备&#xff0c;仅识别人形、车辆等目标&#xff0c;减少无关信息采集。 使用安全…

【C#朗读文本DLL动态按钮控件组及按钮事件文本框拖放数据】2022-1-21

缘由https://bbs.csdn.net/topics/604357098 DotNetSpeech.dll下载_DotNetSpeech.dll免费版下载 - 系统之家 dotnetspeech.dll 64下载-dotnetspeech.dll下载 v10.2 官方版-IT猫扑网 下载了一个DotNetSpeech.dll&#xff0c;放到 \bin\Debug里&#xff0c;添加引用&#xff0c;…

<5>, Qt系统相关

目录 一、Qt 事件 1&#xff0c;事件的定义 2&#xff0c;事件的处理 3&#xff0c;鼠标事件 4&#xff0c;按键事件 5&#xff0c;定时器 6&#xff0c;事件分发器 7&#xff0c;事件过滤器 二、Qt 文件 1&#xff0c;输入输出类 2&#xff0c;文件读写类 3&#x…

WordPress主题代码优化深度指南

引言&#xff1a;为何主题优化至关重要 WordPress作为全球最流行的内容管理系统&#xff0c;其性能表现直接关系到用户体验和网站成功。主题代码优化不仅能够&#xff1a; 提升页面加载速度&#xff08;Google研究表明&#xff0c;页面加载时间每增加1秒&#xff0c;跳出率增加…

数据结构第6章 图(竟成)

第 6 章 图 【考纲内容】 1.图的基本概念 2.图的存储及基本操作&#xff1a;(1) 邻接矩阵法&#xff1b;(2) 邻接表法&#xff1b;(3) 邻接多重表、十字链表 3.图的遍历&#xff1a;(1) 深度优先搜索&#xff1b;(2) 广度优先搜索 4.图的基本应用&#xff1a;(1) 最小 (代价) 生…

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用

【ROS2实体机械臂驱动】rokae xCoreSDK Python测试使用 文章目录 前言正文配置环境下载源码配置环境变量测试运行修改点说明实际运行情况 参考 前言 本文用来记录 xCoreSDK-Python的调用使用1。 正文 配置环境 配置开发环境&#xff0c;这里使用conda做python环境管理&…

黑马Java面试笔记之MySQL篇(优化)

一. 慢查询 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 出现慢查询的情况有以下几种&#xff1a; 聚合查询多表查询表数据量过大查询深度分页查询 表象&#xff1a;页面加载过慢&#xff0c;接口压测响应时间过长&#xff08;超过1s&#xff09; 1.2 如何定位慢查询&…

历史数据分析——广州港

个股简介 公司简介: 华南地区最大的综合性主枢纽港。 本公司是由广州港集团、国投交通、广州发展作为发起人,共同出资以发起方式设立的股份有限公司。 经营分析: 一般经营项目:企业管理服务(涉及许可经营项目的除外);港务船舶调度服务;船舶通信服务;企业自有资金…

图解gpt之Transformer架构与设计原理

Transformer架构。它不仅仅是一个模型&#xff0c;更是一种范式&#xff0c;彻底改变了我们理解和处理自然语言的方式。 2017年&#xff0c;谷歌大脑团队发表了一篇划时代的论文&#xff0c;题目就叫《Attention is All You Need》。这标题本身就充满了力量&#xff0c;宣告了…

HCIP:MPLS静态LSP的配置及抓包

目录 一、MPLS的简单的一些知识点 1.MPLS的概述&#xff1a; 2.MPLS工作原理&#xff1a; 3.MPLS的核心组件&#xff1a; 4. MPLS标签 5.MPLS标签的处理 6.MPLS转发的概述&#xff1a; 7.MPLS的静态LSP建立方式 二、MPLS的静态LSP的实验配置 1.配置接口的地址和配置OS…

Azure DevOps 管道部署系列之一本地服务器

Azure DevOps 是一个帮助改进 SDLC(软件开发生命周期)的平台。 在本文中,我们将使用 Azure Pipelines 创建自动化部署。 Azure DevOps 团队将 Azure Pipelines 定义为“使用 CI/CD 构建、测试和部署,适用于任何语言、平台和云平台”。 在这里,我将解释如何在 Azure Dev…

深入剖析网络协议:七层协议与四层协议详解

在计算机网络的世界中&#xff0c;数据的传输与交互离不开协议的规范。其中&#xff0c;七层协议和四层协议是网络通信架构的核心概念&#xff0c;它们如同网络世界的 “交通规则”&#xff0c;保障着数据准确、高效地在不同设备间流转。本文将深入解读七层协议与四层协议&…

回头看,FPGA+RK3576方案的功耗性能优势

作者&#xff1a;Hello,Panda 各位朋友&#xff0c;大家好&#xff0c;熊猫君这次开个倒车&#xff0c;在这个广泛使用Xilinx&#xff08;Altera&#xff09;高端SoC的时代&#xff0c;分享一个“FPGAARM”实现的低功耗高性能传统方案。 图1 瑞芯微RK3576电路 当前&#xff0c…