clang和gcc的区别


1.Clang采用的license是BSD,而GCC是GPLv3;GCC支持许多语言扩展,其中有些Clang不能实现。

2.GCC:GNU(Gnu’s Not Unix)编译器套装(GNU Compiler Collection,GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU项目的关键部分,同时也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。

3.Clang性能:测试证明Clang编译Objective-C代码时速度为GCC的3倍,还能针对用户发生的编译错误准确地给出建议。(异常的时候提示的特别友好,强烈推荐使用clang)

4.GCC支持的主要处理器架构:ARM、x86、x86-64、MIPS、PowerPC等。

在这里插入图片描述

扩充:Clang是一个C/C++、Objective-C/Objective-C++编程语言的编译器前端,它采用了底层虚拟机(LLVM)作为其后端,它的目标是提供一个GNU编译器套装(GCC)的替代品。

​—

Clang、LLVM 和 GCC 是现代编程领域中常用的编译器工具链,虽然它们在功能上有重叠,但有各自的特点和不同的设计理念。以下是对它们之间区别的详细说明。


1. 什么是 Clang?

Clang 是一个由 LLVM 项目开发的 C/C++/Objective-C 编译器前端,其目的是提供一个现代化、模块化、高性能的编译器替代 GCC。

Clang 的主要特点:
  • 基于 LLVM 后端:
    Clang 是 LLVM 的前端部分,它将源代码编译成 LLVM 中间表示(IR),然后通过 LLVM 优化和生成目标机器代码。

  • 模块化架构:
    Clang 的架构清晰,前端与后端分离,便于扩展或修改(如用于静态分析工具)。

  • 更友好的错误和警告信息:
    Clang 在错误和警告信息的可读性上优于 GCC。例如,它能提供更清晰的上下文、标记代码中的错误位置,方便开发者调试。

  • 更快的编译速度:
    在某些情况下,Clang 的编译速度比 GCC 快,尤其是在增量编译中。

  • 良好的工具链支持:
    Clang 支持多种工具,如 clang-format(代码格式化)、clang-tidy(静态分析)等,广泛用于现代 C++ 开发中。

  • 更宽松的许可证:
    Clang 使用的是 Apache 2.0 许可证(带有 LLVM 的例外),允许在商业项目中使用且无需开源代码。

Clang 的用途:
  • 编译 C/C++/Objective-C 代码。
  • 开发静态分析工具。
  • 在苹果生态系统中应用广泛(如 macOS 和 iOS 开发)。
  • 用作现代语言后端,比如 Swift 和 Rust。

2. 什么是 LLVM?

LLVM 是一个完整的编译器基础架构项目,Clang 是其重要的前端组件之一。它的核心目标是通过中间表示(IR)实现跨平台、高性能的编译和优化。

LLVM 的主要特点:
  • 核心是中间表示(IR):
    LLVM 将源代码编译成一种中间表示(Intermediate Representation,简称 IR),这种表示是跨平台的,便于后续的优化和代码生成。

  • 模块化设计:
    LLVM 将编译过程拆分为多个阶段(前端、优化、后端),每个部分都可以独立使用或替换。

  • 跨平台支持:
    LLVM 支持多种硬件架构和操作系统(x86、ARM、RISC-V、PowerPC 等)。

  • 丰富的工具和库:
    除了 Clang,LLVM 还包括工具如 LLD(链接器)、LLDB(调试器)、Opt(优化工具)等。

  • 可用于多语言:
    LLVM 不仅可以用于 C/C++,还被许多新兴编程语言(如 Rust、Julia、Swift)用作后端。

LLVM 的用途:
  • 用作编译器工具链的基础(如 Clang 和 Rust 编译器)。
  • 开发编程语言。
  • 动态语言的 Just-In-Time (JIT) 编译(如 Python 或 Ruby)。
  • 二进制分析和代码优化工具。

3. 什么是 GCC?

GCC(GNU Compiler Collection)是一个历史悠久的编译器套件,最初是为 C 语言设计的,现在支持 C、C++、Fortran、Ada、Go 等多种编程语言。

GCC 的主要特点:
  • 整体架构:
    GCC 包括前端、优化器和后端,但不像 LLVM 那样模块化。其架构更紧密耦合。

  • 高效的优化能力:
    GCC 长期以来以其强大的优化功能著称,包括编译时优化(如 -O2-O3)和运行时优化。

  • 支持广泛的硬件架构:
    GCC 支持几乎所有主流硬件架构,包括 x86、ARM、MIPS、PowerPC、RISC-V 等。

  • 成熟稳定:
    由于 GCC 的历史悠久,已经积累了丰富的社区支持和大量工业实践验证。

  • GNU GPL 许可证:
    GCC 采用 GPL(通用公共许可证),要求使用 GCC 的衍生作品在发布时也必须开源,这在某些场景下可能是限制。

GCC 的不足:
  • 相比 Clang,错误和警告信息不够直观。
  • 扩展性和模块化不如 LLVM。
GCC 的用途:
  • 编译 C/C++/Fortran 等语言代码。
  • 在 Linux 内核和嵌入式开发领域应用广泛。

4. Clang 与 GCC 的对比

特性ClangGCC
架构设计模块化(基于 LLVM)紧耦合的整体设计
错误信息可读性强,指向具体代码位置,提供详细上下文相对较难阅读,信息较少
编译速度在增量编译和单次编译中可能更快对大规模项目的整体编译可能稍慢
许可证Apache 2.0(更宽松)GNU GPL(需要开源)
工具链支持提供丰富的辅助工具(如 clang-formatclang-tidy工具较少
平台支持同时支持 macOS、Linux、Windows主要应用于 Linux 和嵌入式领域
优化能力强,但相对 GCC 可能略逊极强,特别是在长期积累的领域如嵌入式和内核优化

5. LLVM 与 GCC 的区别

特性LLVMGCC
中间表示 (IR)基于 LLVM IR,便于跨平台优化没有类似通用 IR,优化基于自身架构
模块化设计更清晰,易扩展,支持新语言开发紧耦合,修改或扩展较复杂
适用性更适合现代语言(如 Rust、Swift)和新工具开发传统领域(如嵌入式、Linux 内核)占据优势
实时编译支持支持 JIT 编译主要专注于静态编译

总结与选择建议

  • 如果你需要友好的错误提示、增量编译性能或现代工具链支持,Clang/LLVM 是更好的选择
  • 如果你在嵌入式开发、Linux 内核编译或需要强大的优化能力,GCC 是更成熟的选择
  • LLVM 是更广泛的基础设施工具链,适用于研究和新语言开发,而 GCC 是传统编译器的可靠解决方案

你可以根据自己的项目需求(比如开发平台、目标语言、许可证限制)来选择最适合的工具链。


LLVM IR(Intermediate Representation,中间表示)是 LLVM 编译器框架的核心部分,它是一种用于表示程序的抽象中间代码。LLVM IR 介于高层语言(如 C、C++)和底层机器代码之间,是编译过程中的中间层,用于程序优化和生成目标机器代码。

以下是对 LLVM IR 的详细解析:


1. LLVM IR 的作用

LLVM IR 的作用是为编译器提供一种统一、灵活的表示形式,使编译器可以对程序进行架构无关的优化,并生成适合多种目标平台的代码。它是 LLVM 模块化设计的基础,贯穿整个编译流程,包括以下阶段:

  1. 前端: 将高层语言代码(如 C++)翻译为 LLVM IR。
  2. 中间优化: 对 LLVM IR 进行各种优化(如死代码消除、循环优化)。
  3. 后端: 将 LLVM IR 翻译为目标机器代码(如 x86、ARM)。

2. LLVM IR 的特点

架构独立性
  • LLVM IR 不是特定于某种硬件架构的,而是一种抽象语言,这使得它可以在同一个中间表示的基础上生成不同平台的目标代码(如 x86、ARM)。
强类型系统
  • LLVM IR 是强类型语言,每个值都有明确的类型(如 i32 表示 32 位整数,float 表示单精度浮点数)。
三种表示形式
  • LLVM IR 有三种不同的表示形式:
    1. 文本格式: 便于人类阅读和调试。
    2. 字节码(Bitcode): 高效的二进制表示,用于在工具链中传递。
    3. 内存中表示: 编译器在运行时操作的内部数据结构。
易于优化
  • LLVM IR 的设计使其便于执行各种架构无关的优化,如函数内联、循环展开、冗余指令消除等。

3. LLVM IR 的语法和结构

LLVM IR 类似于汇编语言,但比汇编更抽象。以下是一些关键的语言特性:

模块化结构

一个 LLVM IR 程序由以下主要部分组成:

  1. 模块 (Module): 表示整个程序,包括全局变量、函数等。
  2. 函数 (Function): 每个函数是基本块(Basic Block)的集合。
  3. 基本块 (Basic Block): 是一系列指令的线性序列,以控制流指令结束。
  4. 指令 (Instruction): 单个操作,如算术运算、内存访问、函数调用等。
简单示例

以下是一个简单的 LLVM IR 示例代码,用于计算两个整数的和:

; 声明一个函数 add(i32, i32) -> i32
define i32 @add(i32 %a, i32 %b) {
entry:%sum = add i32 %a, %b    ; 计算 %a + %bret i32 %sum            ; 返回结果
}

解析:

  • define i32 @add(i32 %a, i32 %b):定义一个函数,名称为 add,接受两个 32 位整数参数,返回一个 32 位整数。
  • %a%b:函数的两个参数。
  • %sum = add i32 %a, %b:将 %a%b 相加,结果存储在 %sum
  • ret i32 %sum:返回 %sum 的值。

4. LLVM IR 的类型系统

LLVM IR 的类型系统非常丰富,以下是一些常见的类型:

  • 整数类型:i1(1 位布尔值)、i8(8 位整数)、i32(32 位整数)。
  • 浮点类型:float(单精度)、double(双精度)。
  • 指针类型:i32* 表示指向 32 位整数的指针。
  • 数组类型:[10 x i32] 表示包含 10 个 32 位整数的数组。
  • 结构体类型: 类似于 C 的结构体,如 { i32, float }

5. LLVM IR 的优势

平台无关性
  • 编译器可以生成 LLVM IR,然后通过 LLVM 的后端生成适合多种硬件架构的机器代码(如 ARM、x86)。
强大的优化能力
  • LLVM IR 是为优化设计的,LLVM 提供了许多优化 passes,可以大幅提升代码运行效率。
灵活的工具支持
  • LLVM IR 可以被用于静态分析、程序转换和动态代码生成。
  • 很多现代语言(如 Rust、Julia、Swift)都使用 LLVM IR 作为中间表示。

6. LLVM IR 与其他中间表示的比较

特性LLVM IRGCC GIMPLE(GCC 的 IR)Java 字节码
抽象级别中层,介于源码和机器码之间更接近源码高层,接近虚拟机指令集
平台独立性高,跨平台中等,主要针对 GCC 支持的平台高,运行于 JVM 上
优化能力强,针对编译时和运行时优化强,优化针对 C/C++一般,针对 JVM 的优化
类型系统强类型(支持复杂类型)弱类型(简化版 C 类型)强类型

7. 总结

LLVM IR 是一种架构无关的中间表示语言,主要用于:

  • 作为编译器前端(如 Clang)和后端之间的桥梁。
  • 提供编译时的高效优化能力。
  • 支持多种硬件架构和操作系统。

它是现代编译器的重要组成部分,也是 LLVM 成功的关键。通过学习 LLVM IR,可以深入了解编译器的工作原理和优化技术。


是的,LLVM 不仅可以搭配 Clang 作为前端,还可以搭配许多其他的编程语言前端,用于开发和编译各种语言。LLVM 的设计是模块化的,前端和后端是松耦合的,这使得它可以轻松支持新语言或扩展功能。

以下是几个使用 LLVM 搭配不同前端的示例:


1. Rust 编译器:Rust 前端 + LLVM 后端

  • 前端:Rustc(Rust Compiler)
    • Rust 使用自己的编译器 rustc,负责将 Rust 源代码解析并转换为 LLVM IR。
    • Rustc 将生成的 LLVM IR 传递给 LLVM,完成后续的优化和机器码生成。
示例:Rust 编译流程
  1. Rust 源代码:
    fn main() {println!("Hello, world!");
    }
    
  2. 编译器流程:
    • Rustc 解析和分析源码,将其翻译为 LLVM IR。
    • LLVM IR 经过优化后,由 LLVM 后端生成目标机器代码(如 x86 或 ARM)。
输出 IR 示例

Rust 的 LLVM IR 可能类似于以下内容:

define i32 @main() {
entry:%msg = call i32 @println("Hello, world!")ret i32 0
}

2. Swift 编译器:Swift 前端 + LLVM 后端

  • 前端:Swift 编译器
    • Swift 编译器是由 Apple 开发的现代化语言前端,直接基于 LLVM。
    • 它将 Swift 代码翻译成 LLVM IR,随后由 LLVM 生成优化后的机器代码。
示例:Swift 编译流程
  1. Swift 源代码:
    print("Hello, Swift!")
    
  2. 编译器流程:
    • Swift 前端解析代码,将其翻译为 LLVM IR。
    • LLVM 生成对应的机器代码。

Swift 的开发工具链完全依赖 LLVM,因此可以获得 LLVM 提供的所有优化能力。


3. Julia 编译器:Julia 前端 + LLVM 后端

  • 前端:Julia
    • Julia 是一种动态语言,特别适合科学计算和数据处理。
    • Julia 使用 LLVM 作为其后端,直接将动态语言的表达式 JIT(Just-In-Time)编译为高效的机器码。
示例:Julia 编译流程
  1. Julia 源代码:
    println("Hello, Julia!")
    
  2. 编译器流程:
    • Julia 的前端解析代码,并生成 LLVM IR。
    • LLVM 使用 JIT 技术即时生成机器代码并运行。
特点:
  • Julia 借助 LLVM 的强大优化能力,可以将高性能计算代码直接编译为本地机器码,从而实现接近 C/C++ 的性能。

4. Kotlin/Native 编译器:Kotlin 前端 + LLVM 后端

  • 前端:Kotlin/Native
    • Kotlin/Native 是 JetBrains 为 Kotlin 提供的一个非 JVM 目标运行时,可以编译为本地机器码。
    • 它使用 LLVM 作为后端。
示例:Kotlin/Native 编译流程
  1. Kotlin 源代码:
    fun main() {println("Hello, Kotlin/Native!")
    }
    
  2. 编译器流程:
    • Kotlin/Native 前端将 Kotlin 源码翻译成 LLVM IR。
    • LLVM 将其优化并生成目标机器码。

5. JavaScript/TypeScript:AssemblyScript 前端 + LLVM 后端

  • 前端:AssemblyScript
    • AssemblyScript 是一种类似 TypeScript 的语言,主要用于 WebAssembly 的开发。
    • 它可以通过 LLVM 后端将 AssemblyScript 代码编译为高效的 WebAssembly 字节码。
示例:AssemblyScript 编译流程
  1. AssemblyScript 源代码:
    export function add(a: i32, b: i32): i32 {return a + b;
    }
    
  2. 编译器流程:
    • AssemblyScript 前端将代码翻译为 LLVM IR。
    • LLVM 生成 WebAssembly 字节码(而非机器代码)。

6. Python:Numba 前端 + LLVM 后端

  • 前端:Numba
    • Numba 是一个基于 Python 的 JIT 编译器,专注于科学计算。
    • 它使用 LLVM 将 Python 函数直接编译为高效的机器码。
示例:Numba 编译流程
  1. Python 源代码:
    from numba import jit@jit
    def add(a, b):return a + bprint(add(3, 5))
    
  2. 编译器流程:
    • Numba 的前端将 Python 函数分析后生成 LLVM IR。
    • LLVM 将 LLVM IR 编译为机器码,并即时运行。

7. Go 编译器:LLGo(实验性)+ LLVM 后端

  • 前端:LLGo
    • LLGo 是一个 Go 编译器前端,使用 LLVM 作为后端。
    • 它负责将 Go 源码解析为 LLVM IR。
示例:Go 编译流程
  1. Go 源代码:
    package mainimport "fmt"func main() {fmt.Println("Hello, Go!")
    }
    
  2. 编译器流程:
    • LLGo 解析代码,生成 LLVM IR。
    • LLVM 后端生成机器代码。

总结

除了 Clang,以下是一些常见语言与 LLVM 的结合:

语言前端编译器用途
C/C++/Objective-CClang通用编译器
RustRustc系统级语言,适用于高性能和安全编程
SwiftSwift Compiler苹果生态系统开发
JuliaJulia Frontend科学计算、动态语言 JIT 编译
Kotlin/NativeKotlin Compiler非 JVM 环境的本地编译
AssemblyScriptAssemblyScriptWebAssembly 开发
PythonNumbaJIT 编译 Python 数学代码
GoLLGo用于 Go 的 LLVM 实验性前端

通过这些例子可以看到,LLVM 的模块化设计为多种语言的开发提供了统一的后端解决方案,同时赋予这些语言强大的性能优化能力。


Clang + LLVM 的编译流程中,预处理编译汇编链接 仍然是必需的,只是它们的执行职责在 Clang 和 LLVM 之间有所分工。相比 GCC,Clang 负责前端阶段的任务,而 LLVM 则负责中间和后端的优化及生成机器码。以下是详细解析:


Clang + LLVM 的编译流程

在 Clang + LLVM 的架构中,各个阶段的分工如下:

  1. 预处理 (Preprocessing)

    • 责任主体:Clang
    • 和 GCC 一样,Clang 会处理 C/C++ 的头文件展开、宏替换、注释删除等预处理工作。
    • 输入:C/C++ 源文件
      输出:预处理后的源文件(.i 文件)。
    • 执行命令示例:
      clang -E source.c -o source.i
      
  2. 编译 (Compilation)

    • 责任主体:Clang
    • Clang 会将预处理后的源文件解析为 抽象语法树(AST),然后将其转换为 LLVM IR(中间表示)。
    • 这个阶段相当于 GCC 中的编译阶段,但输出的是架构无关的 LLVM IR,而不是直接的汇编代码。
    • 输入:预处理后的源文件(.i 文件)
      输出:LLVM IR 文件(.ll 文件)。
    • 执行命令示例:
      clang -S -emit-llvm source.c -o source.ll
      
  3. 优化和代码生成 (Optimization and Code Generation)

    • 责任主体:LLVM
    • LLVM 的中间端会对生成的 LLVM IR 进行架构无关的优化(如死代码删除、常量折叠等),然后由后端将优化后的 IR 转换为目标架构的汇编代码或机器码。
    • 输入:LLVM IR 文件(.ll.bc 文件)
      输出:汇编代码(.s 文件)或目标文件(.o 文件)。
    • 执行命令示例:
      llc source.ll -o source.s   # 使用 LLVM 的 llc 工具生成汇编代码
      
  4. 汇编 (Assembly)

    • 责任主体:LLVM
    • LLVM 的后端可以将汇编代码转换为二进制的目标代码(目标文件,.o 文件)。这个过程类似于 GCC 的汇编阶段。
    • 输入:汇编代码(.s 文件)
      输出:目标文件(.o 文件)。
    • 执行命令示例:
      clang -c source.c -o source.o
      
  5. 链接 (Linking)

    • 责任主体:Clang 调用外部链接器(通常是 GNU ld 或 lld)
    • Clang 会调用链接器(默认是 ld 或 LLVM 提供的 lld)将目标文件和库文件链接为最终的可执行文件。
    • 输入:目标文件(.o 文件)、库文件
      输出:可执行文件(如 a.out)。
    • 执行命令示例:
      clang source.o -o executable
      

分工对比:GCC 与 Clang + LLVM

阶段GCCClang + LLVM
预处理GCC 前端负责Clang 前端负责
编译GCC 前端负责Clang 前端负责,生成 LLVM IR
优化和代码生成GCC 后端负责(生成汇编代码)LLVM 中间端负责优化,后端生成机器码
汇编调用 GNU AssemblerLLVM 后端或外部汇编器负责
链接调用 GNU ld 链接器Clang 调用 GNU ld 或 LLVM lld

Clang + LLVM 的特点

  1. 模块化设计

    • Clang 和 LLVM 是分离的模块。Clang 专注于前端(处理语言语法和生成 LLVM IR),而 LLVM 专注于后端(优化和代码生成)。
  2. 基于 LLVM IR 的编译流程

    • 与 GCC 直接生成目标机器代码不同,Clang 会先生成架构无关的 LLVM IR,这使得优化更灵活,也便于移植到多种架构。
  3. 灵活性

    • Clang + LLVM 不强制绑定某个工具链。例如:
      • 你可以只用 Clang 的前端生成 LLVM IR,然后用其他工具处理。
      • 你可以用 LLVM 的后端(如 llc)单独处理 IR,而无需前端。

是否需要 “预处理、编译、汇编、链接” 阶段?

Clang + LLVM 的流程中,这些阶段仍然存在,但由于它们被集成到 Clang 和 LLVM 中,用户不一定需要显式地区分这些步骤。比如,以下命令可以一步完成整个流程:

clang source.c -o executable

这条命令会自动执行:

  1. 预处理(生成 .i 文件)。
  2. 编译(生成 LLVM IR)。
  3. 优化和代码生成(生成 .s.o 文件)。
  4. 汇编和链接(生成可执行文件)。

总结

  • 在 Clang + LLVM 的结构中,预处理编译 是由 Clang 前端完成的,汇编链接 则是由 LLVM 后端和链接器完成的。
  • 与传统的 GCC 工具链类似,Clang + LLVM 并没有省略这些阶段,只是通过模块化设计将它们的职责划分得更清晰。
  • 如果需要手动分步骤运行,Clang 和 LLVM 提供了灵活的命令,可以分别执行每个阶段的操作,比如生成 LLVM IR、优化、汇编或链接。

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

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

相关文章

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年,OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是,在AI驱动的…

DICOM MPPS详细介绍

文章目录 前言一、常规检查业务流程二、MPPS的作用三、MPPS的原理1、MPPS与MWL2、MPPS服务过程 四、MPPS的实现步骤1、创建实例2、传递状态 五、总结 前言 医院中现有的DICOM MWL(Modality Worklist)已开始逐渐得到应用,借助它可以实现病人信息的自动录入&#xff0…

【笔记2-3】ESP32 bug:PSRAM chip not found or not supported 没有外部PSRAM问题解决

主要参考b站宸芯IOT老师的视频,记录自己的笔记,老师讲的主要是linux环境,但配置过程实在太多问题,就直接用windows环境了,老师也有讲一些windows的操作,只要代码会写,操作都还好,开发…

【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解

目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…

深入理解AVL树:结构、旋转及C++实现

1. AVL树的概念 什么是AVL树? AVL树是一种自平衡的二叉搜索树,其发明者是Adelson-Velsky和Landis,因此得名“AVL”。AVL树是首个自平衡二叉搜索树,通过对树的平衡因子进行控制,确保任何节点的左右子树高度差最多为1&…

Css动画:旋转相册动画效果实现

​🌈个人主页:前端青山 🔥系列专栏:Css篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来Css篇专栏内容:Css动画:旋转相册动画效果实现 前言 随着Web技术的发展,网页不再局限于静态展示&#…

ElasticSearch 与向量数据库的结合实践:突破亿级大表查询瓶颈20241204

💡 ElasticSearch 与向量数据库的结合实践:突破亿级大表查询瓶颈 📚 引言 随着业务规模的不断扩大,传统关系型数据库在处理 亿级大表 时,性能瓶颈愈加凸显。关键词检索、模糊查询、多条件筛选等需求逐步升级&#xff…

解决stable-diffusion-webui时的问题:No module ‘xformers‘. Proceeding without it

p.s 被另一篇文章坑了,装个xformers把我原先的pytorch降智了&%$^# 注意:!!!xformers非强制安装;可优化显存,提高性能和出图速率,对于GPU能力有限的用户很有用;安装过…

如何加强游戏安全,防止定制外挂影响游戏公平性

在现如今的游戏环境中,外挂始终是一个困扰玩家和开发者的问题。尤其是定制挂(Customized Cheats),它不仅复杂且隐蔽,更能针对性地绕过传统的反作弊系统,对游戏安全带来极大威胁。定制挂通常是根据玩家的需求…

【Python系列】使用 `psycopg2` 连接 PostgreSQL 数据库

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Linux 权限管理:用户分类、权限解读与常见问题剖析

🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 🚩用通俗易懂且不失专业性的文字,讲解计算机领域那些看似枯燥的知识点🚩 目录 💯L…

LeetCode 力扣 热题 100道(十四)二叉树的中序遍历(C++)

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 如下为代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullpt…

运费微服务和redis存热点数据

目录 运费模板微服务 接收前端发送的模板实体类 插入数据时使用的entity类对象 BaseEntity类 查询运费模板服务 新增和修改运费模块 整体流程 代码实现 运费计算 整体流程 总的代码 查找运费模板方法 计算重量方法 Redis存入热点数据 1.从nacos导入共享redis配置…

【C++】—— set 与 multiset

【C】—— map 与 set 1 序列式容器和关联式容器2 set 系列的使用2.1 set 和 multiset 参考文档2.2 set 类的介绍2.3 set 的迭代器和构造2.4 set的增删查2.4.1 insert2.4.2 find 与 erase2.4.3 count 2.5 lower_bound 与 upper_bound2.6 multiset 与 set 的差异2.6.1 不再去重2…

Jupyter Notebook认识、安装和启动以及使用

Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用一、认识Jupyter Notebook1.1 Jupyter Notebook概述1.2 Jupyter Notebook 重要特性(1)交互式代码执行(2)支持多种编程语言(3)富文本编辑(4)代码高…

算法第一弹-----双指针

目录 1.移动零 2.复写零 3.快乐数 4.盛水最多的容器 5.有效三角形的个数 6.查找总价值为目标值的两个商品 7.三数之和 8.四数之和 双指针通常是指在解决问题时,同时使用两个指针(变量,常用来指向数组、链表等数据结构中的元素位置&am…

【后端面试总结】golang channel深入理解

在Go语言中,Channel是一种用于在goroutine之间进行通信和同步的重要机制。它提供了一种安全、类型安全的方式来传递数据,使得并发编程变得更加直观和简单。本文将详细介绍Golang中Channel的基本概念、创建与关闭、发送与接收操作,以及相关的使…

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735,目前主流的版本都适用(V1R5~V2R1的就不在列了,版本太老了,界面完全不一样,这里调试线接的console口,电脑的网络接在ETH口) 「模拟器、工具合集」复制整段内…

详解Java数据库编程之JDBC

目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后,在IDEA中创建的项目中建立一个lib目录,然后把刚刚下载好的jar包拷贝进去,然后右键刚刚添加的jar包,点击‘添…

网络(TCP)

目录 TCP socket API 详解 套接字有哪些类型?socket有哪些类型? 图解TCP四次握手断开连接 图解TCP数据报结构以及三次握手(非常详细) socket缓冲区以及阻塞模式详解 再谈UDP和TCP bind(): 我们的程序中对myaddr参数是这样…