LLVM 的中间代码(IR) 基本语法
LLVM 的中间代码(IR) 基本语法
以下是 LLVM IR 的基本语法和每个语法的实例代码:
1.数据类型
LLVM IR 支持多种数据类型,包括整型、浮点型、指针型和向量型等。以下是 LLVM IR 中定义不同类型的语法和示例代码:
- 整型:i1、i8、i16、i32、i64 等,表示不同位数的整数。
; 定义一个 32 位整型变量
%var = alloca i32
- 浮点型:float、double 等,表示不同位数的浮点数。
; 定义一个 64 位浮点型变量
%var = alloca double
- 指针型:用于表示内存地址,例如 void*、int* 等。
; 定义一个指向整型的指针变量
%ptr = alloca i32*
- 向量型:用于表示一组相同类型的值,例如 <4 x i32> 表示包含 4 个 32 位整数的向量。
; 定义一个包含 4 个 32 位整数的向量变量
%vec = alloca <4 x i32>
2.常量
LLVM IR 支持多种常量,包括整型常量、浮点型常量、指针常量和向量常量等。以下是 LLVM IR 中定义不同类型常量的语法和示例代码:
- 整型常量:用于表示整数值。
; 定义一个整型常量
%i32 = i32 42
- 浮点型常量:用于表示浮点数值。
; 定义一个浮点型常量
%f64 = double 3.14
- 指针常量:用于表示内存地址。
; 定义一个指向 i32 类型的指针常量
%i32ptr = i32* inttoptr (i64 0 to i32*)
- 向量常量:用于表示一组相同类型的值。
; 定义一个包含 4 个 32 位整数的向量常量
%vec = <4 x i32> <i32 1, i32 2, i32 3, i32 4>
3.函数
LLVM IR 中的函数包含函数名称、函数参数、函数返回类型和函数体等。函数体由多个基本块组成。以下是 LLVM IR 中定义函数的语法和示例代码:
; 定义一个名为 'foo' 的函数,参数为 i32 类型,返回值类型为 i32
define i32 @foo(i32 %arg) {
entry:; 函数体由基本块组成,entry 是函数入口基本块%tmp = add i32 %arg, 1ret i32 %tmp
}
4.指令
LLVM IR 中的指令用于执行具体的操作,例如算术运算、逻辑运算、比较、分支等。以下是 LLVM IR 中定义不同类型指令的语法和示例代码:
- 算术运算指令:用于执行加、减、乘、除等算术运算。
; 定义一个加法指令,将 i32 类型的变量 %a 和 %b 相加
%sum = add i32 %a, %b
- 逻辑运算指令:用于执行与、或、非等逻辑运算。
; 定义一个逻辑与指令,将 i1 类型的变量 %a 和 %b 做逻辑与操作
%result = and i1 %a, %b
- 比较指令:用于执行比较操作,例如等于、不等于、大于等。
; 定义一个比较指令,比较 i32 类型的变量 %a 和 %b 是否相等
%eq = icmp eq i32 %a, %b
- 分支指令:用于实现条件分支。
; 定义一个分支指令,如果 %condition 为真,则跳转到 label1,否则跳转到 label2
br i1 %condition, label %label1, label %label2
- 加载/存储指令:用于实现内存读写操作。
; 定义一个存储指令,将 i32 类型的变量 %value 存储到指针变量 %ptr 指向的内存地址中
store i32 %value, i32* %ptr; 定义一个加载指令,将指针变量 %ptr 指向的内存地址中的值读取出来,并存储到 i32 类型的变量 %value 中
%value = load i32, i32* %ptr
5. 全局变量
LLVM IR 中的全局变量是在函数外定义的变量,可以在整个程序中访问。以下是 LLVM IR 中定义全局变量的语法和示例代码:
; 定义一个名为 'global_var' 的全局变量,类型为 i32,初始值为 0
@global_var = global i32 0; 访问全局变量
%value = load i32, i32* @global_var
6.注释
LLVM IR 中的注释以分号(;)开头,可以在代码中添加注释来解释代码的含义。以下是 LLVM IR 中添加注释的示例代码:
; 这是一条注释,用于解释下面的代码含义
%sum = add i32 %a, %b ; 这也是一条注释
7.函数定义和调用
在 LLVM IR 中定义函数和调用函数都非常简单。以下是定义函数和调用函数的语法和示例代码:
; 定义一个名为 'add' 的函数,返回类型为 i32,参数为 i32 类型的变量 %a 和 %b
define i32 @add(i32 %a, i32 %b) {; 函数体%sum = add i32 %a, %bret i32 %sum
}; 调用函数 'add',将参数 %x 和 %y 传递给函数,并将返回值存储到变量 %result 中
%x = 10
%y = 20
%result = call i32 @add(i32 %x, i32 %y)
8.强制类型转换
在 LLVM IR 中,可以使用强制类型转换来将一个类型转换为另一个类型。以下是强制类型转换的语法和示例代码:
; 定义一个 i32 类型的变量 %a
%a = i32 10; 将变量 %a 转换为 i64 类型,并存储到变量 %b 中
%b = sext i32 %a to i64
9.组合类型
在 LLVM IR 中,可以使用组合类型来表示复杂的数据结构。以下是 LLVM IR 中定义组合类型的语法和示例代码:
; 定义一个结构体类型,包含两个字段:i32 类型的变量 %a 和 i64 类型的变量 %b
%my_struct = type { i32, i64 }; 定义一个名为 'my_var' 的全局变量,类型为结构体类型 %my_struct,初始值为 { 10, 20 }
@my_var = global %my_struct { i32 10, i64 20 }
10.获取地址
在 LLVM IR 中,可以使用 & 操作符获取变量的地址。以下是获取变量地址的语法和示例代码:
; 定义一个名为 'my_var' 的全局变量,类型为 i32,初始值为 10
@my_var = global i32 10; 获取变量 'my_var' 的地址,并存储到变量 %ptr 中
%ptr = getelementptr i32, i32* @my_var, i32 0, i32 0
11.定义别名
在 LLVM IR 中,可以使用别名来引用其他变量或函数。以下是定义别名的语法和示例代码:
; 定义一个名为 'my_var' 的全局变量,类型为 i32,初始值为 10
@my_var = global i32 10; 定义一个名为 'my_alias' 的别名,引用全局变量 'my_var'
@my_alias = alias i32* @my_var
12.分支和循环
在 LLVM IR 中,可以使用分支和循环指令来实现控制流。以下是分支和循环指令的语法和示例代码:
; 定义一个名为 'my_func' 的函数,返回类型为 void,没有参数
define void @my_func() {; 定义一个标签 'entry'entry:; 定义一个 i32 类型的变量 %i,初始值为 0%i = alloca i32store i32 0, i32* %i; 定义一个标签 'loop'loop:; 加载变量 %i 的值,并将其加 1%i_val = load i32, i32* %i%next_i = add i32 %i_val, 1; 将计算后的值存储到变量 %i 中store i32 %next_i, i32* %i; 如果 %i 的值小于 10,则跳转到标签 'loop'%cond = icmp slt i32 %next_i, 10br i1 %cond, label %loop, label %exit; 定义一个标签 'exit'exit:ret void
}
13.内存操作
在 LLVM IR 中,可以使用 load 和 store 指令来进行内存读写操作。以下是 load 和 store 指令的语法和示例代码:
; 定义一个 i32 类型的全局变量 %my_var,初始值为 10
@my_var = global i32 10; 将全局变量 %my_var 的值加载到变量 %val 中
%val = load i32, i32* @my_var; 将变量 %new_val 的值存储到全局变量 %my_var 中
%new_val = add i32 %val, 5
store i32 %new_val, i32* @my_var
14.数组和指针
在 LLVM IR 中,可以使用数组和指针来处理数据。以下是数组和指针的语法和示例代码:
; 定义一个名为 'my_func' 的函数,返回类型为 i32,有一个指向 i32 类型的数组的指针参数 %arr
define i32 @my_func(i32* %arr) {; 获取数组第 0 个元素的地址,并将其存储到变量 %arr_ptr 中%arr_ptr = getelementptr i32, i32* %arr, i32 0; 将数组第 0 个元素的值加载到变量 %val 中%val = load i32, i32* %arr_ptr; 返回变量 %val 的值ret i32 %val
}; 定义一个名为 'my_arr' 的全局数组,包含三个 i32 类型的元素
@my_arr = global [3 x i32] [i32 10, i32 20, i32 30]; 调用函数 'my_func',将数组 'my_arr' 的首地址传递给函数,并将返回值存储到变量
%result = call i32 @my_func(i32* getelementptr inbounds ([3 x i32], [3 x i32]* @my_arr, i32 0, i32 0)); 输出变量 %result 的值
; 注意:此处的 'i32' 表示要输出的值为 32 位整数
; 如果要输出其他类型的值,需要相应地修改 'i32' 为其他类型
; 例如:float 表示单精度浮点数,double 表示双精度浮点数,等等
; 如果要输出字符串,则需要使用 'string' 类型
; 例如:%fmt_str = constant [14 x i8] c"result: %d\n\00"
; call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result)
; 其中,'...' 表示可变参数,'i8*' 表示字符串的地址,%fmt_str 表示字符串变量的名称
%fmt_str = constant [9 x i8] c"%d\n\00"
call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result)
15.结构体
在 LLVM IR 中,可以使用结构体来组织数据。以下是结构体的语法和示例代码:
; 定义一个名为 'Person' 的结构体,包含两个字段:'name' 和 'age'
%Person = type { i8*, i32 }; 定义一个名为 'my_func' 的函数,返回类型为 i32,有一个指向 'Person' 结构体的指针参数 %person_ptr
define i32 @my_func(%Person* %person_ptr) {; 获取结构体第 1 个字段 'age' 的地址,并将其存储到变量 %age_ptr 中%age_ptr = getelementptr %Person, %Person* %person_ptr, i32 0, i32 1; 将结构体第 1 个字段 'age' 的值加载到变量 %age 中%age = load i32, i32* %age_ptr; 返回变量 %age 的值ret i32 %age
}; 定义一个名为 'my_person' 的全局结构体变量,包含两个字段:'name' 和 'age'
@my_person = global %Person { i8* getelementptr inbounds ([6 x i8], [6 x i8]* @name_str, i32 0, i32 0), i32 20 }; 调用函数 'my_func',将结构体 'my_person' 的首地址传递给函数,并将返回值存储到变量 %result 中
%result = call i32 @my_func(%Person* @my_person); 输出变量 %result 的值
%fmt_str = constant [9 x i8] c"%d\n\00"
call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result); 定义一个名为 'name_str' 的全局字符串,用于初始化结构体 'my_person' 中的 'name' 字段
@name_str = private unnamed_addr constant [6 x i8] c"John
16.全局变量
在 LLVM IR 中,可以使用全局变量来在函数之间共享数据。以下是全局变量的语法和示例代码:
; 定义一个名为 'my_global_var' 的全局变量,类型为 i32,初始值为 10
@my_global_var = global i32 10; 定义一个名为 'my_func' 的函数,返回类型为 i32,无参数
define i32 @my_func() {; 加载全局变量 'my_global_var' 的值到变量 %var 中%var = load i32, i32* @my_global_var; 将变量 %var 的值乘以 2%var_times_2 = mul i32 %var, 2; 将变量 %var_times_2 的值存储到全局变量 'my_global_var' 中store i32 %var_times_2, i32* @my_global_var; 返回变量 %var_times_2 的值ret i32 %var_times_2
}; 调用函数 'my_func',将返回值存储到变量 %result 中
%result = call i32 @my_func(); 输出变量 %result 的值
%fmt_str = constant [9 x i8] c"%d\n\00"
call i32 (i8*, ...) @printf(i8* %fmt_str, i32 %result)
17.运算符
在 LLVM IR 中,支持各种算术运算符、位运算符、比较运算符和逻辑运算符。以下是运算符的语法和示例代码:
; 算术运算符
%a = add i32 1, 2 ; %a = 1 + 2 = 3
%b = sub i32 5, 3 ; %b = 5 - 3 = 2
%c = mul i32 2, 3 ; %c = 2 * 3 = 6
%d = sdiv i32 10, 3 ; %d = 10 / 3 = 3(整数除法)
%e = fadd double 1.0, 2.0 ; %e = 1.0 + 2.0 = 3.0(双精度浮点数加法)
%f = fsub float 5.0, 3.0 ; %f = 5.0 - 3.0 = 2.0(单精度浮点数减法)
%g = fmul double 2.0, 3.0 ; %g = 2.0 * 3.0 = 6.0(双精度浮点数乘法)
%h = fdiv float 10.0, 3.0 ; %h = 10.0 / 3.0 ≈ 3.3333(单精度浮点数除法); 位运算符
%i = shl i32 1, 2 ; %i = 1 << 2 = 4(左移 2 位)
%j = shr i32 8, 2 ; %j = 8 >> 2 = 2(右移
; 比较运算符
%k = icmp eq i32 1, 2 ; %k = 1 == 2(相等性比较),结果为 i1 类型
%l = icmp slt i32 3, 4 ; %l = 3 < 4(有符号整数小于比较),结果为 i1 类型
%m = fcmp olt float 1.0, 2.0 ; %m = 1.0 < 2.0(有序单精度浮点数小于比较),结果为 i1 类型; 逻辑运算符
%n = and i1 1, 0 ; %n = 1 & 0 = 0(逻辑与),结果为 i1 类型
%o = or i1 1, 0 ; %o = 1 | 0 = 1(逻辑或),结果为 i1 类型
%p = xor i1 1, 0 ; %p = 1 ^ 0 = 1(逻辑异或),结果为 i1 类型
%q = icmp eq i1 %n, %o ; %q = %n == %o(相等性比较),结果为 i1 类型
18.控制流
在 LLVM IR 中,支持各种控制流语句,如条件语句、循环语句和跳转语句。以下是控制流语句的语法和示例代码:
; 条件语句
define i32 @max(i32 %a, i32 %b) {%max = phi i32 [ %a, %entry ], [ %b, %if_true ]%cmp = icmp sgt i32 %a, %bbr i1 %cmp, label %if_true, label %if_falseif_true:br label %mergeif_false:br label %mergemerge:%result = phi i32 [ %a, %if_false ], [ %b, %if_true ]ret i32 %result
}; 循环语句
define i32 @sum(i32 %n) {%sum = alloca i32store i32 0, i32* %sumbr label %looploop:%i = phi i32 [ 0, %entry ], [ %next_i, %loop_body ]%acc = phi i32 [ 0, %entry ], [ %next_acc, %loop_body ]%cmp = icmp slt i32 %i, %nbr i1 %cmp, label %loop_body, label %exitloop_body:%next_i = add i32 %i, 1%next_acc = add i32 %acc, %ibr label %loopexit:%result = load i32, i32* %sumret i32 %result
}; 跳转语句
define void @foo() {br label %looploop:%i = phi i32 [ 0, %entry ], [ %next_i, %loop_body ]%cmp = icmp eq i32 %i, 10br i1 %cmp, label %exit, label %loop_body
19.全局变量和常量
在 LLVM IR 中,可以定义全局变量和常量,以下是全局变量和常量的语法和示例代码:
; 定义全局变量
@global_var = global i32 0; 定义全局常量
@global_const = constant [12 x i32] [i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12]define i32 @access_global_var() {%ptr = getelementptr i32, i32* @global_var, i32 0%val = load i32, i32* %ptrret i32 %val
}define i32* @access_global_const() {%ptr = getelementptr [12 x i32], [12 x i32]* @global_const, i32 0, i32 0ret i32* %ptr
}
20.函数
在 LLVM IR 中,可以定义函数,并为函数指定参数和返回值类型,以下是函数的语法和示例代码:
; 定义函数
define i32 @add(i32 %a, i32 %b) {%result = add i32 %a, %bret i32 %result
}; 调用函数
define i32 @foo() {%a = add i32 1, 2%b = add i32 %a, 3%c = call i32 @add(i32 %a, i32 %b)ret i32 %c
}
21.异常处理
在 LLVM IR 中,也支持异常处理,以下是异常处理的语法和示例代码:
; 异常处理
define void @test() personality i32 (...)* @__gxx_personality_v0 {
entry:invoke void @foo() to label %exit unwind label %catchcatch:%exn = landingpad { i8*, i32 }catch i8* bitcast (i8** @typeinfo to i8*)%ptr = extractvalue { i8*, i32 } %exn, 0%msg = call i8* @__cxa_demangle(i8* %ptr, i8* null, i32* null, i32* null)call void @puts(i8* %msg)call void @free(i8* %msg)resume { i8*, i32 } %exnexit:ret void
}declare i8* @__cxa_demangle(i8*, i8*, i32*, i32*)
declare void @puts(i8*)
declare void @free(i8*)
declare i8** @typeinfo
以上是 LLVM IR 的基本语法和示例代码,当然还有更多高级的语法和技巧可以使用。
相关文章:
LLVM 的中间代码(IR) 基本语法
LLVM 的中间代码(IR) 基本语法 以下是 LLVM IR 的基本语法和每个语法的实例代码: 1.数据类型 LLVM IR 支持多种数据类型,包括整型、浮点型、指针型和向量型等。以下是 LLVM IR 中定义不同类型的语法和示例代码: 整…...

多标签在单行出现省略的实现
简言 实现在有宽度的一行内,标签过多会出现省略号。 实现 首先要实现单行省略的效果。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…...
第二十七章 纹理总结
OpenGL 纹理是左下角(0,0) 右上角(1,1)。 需要告诉OpenGL纹理环绕方式,主要有四种:GL_REPEAT(重复纹理图像),GL_MIRRORED_REPEAT(重复纹理图像,但是每次重复图片是镜像放置的), GL_CLAMP_TO_EDGE(坐标再0-1直接,超出部分会重复纹理坐标的边缘,有边缘拉伸效果),GL…...

【Linux面试】-(腾讯,百度,美团,滴滴)
文章目录Linux 面试题-(腾讯,百度,美团,滴滴) 分析日志 t.log(访问量),将各个 ip 地址截取,并统计出现次数,并按从大到小排序(腾讯) http://192.168.200.10/index1.html http://192.168.200.10/index2.html http://192.168.200.20/index1.html http://19…...

编译链接和预处理
🌺在本次的博客当中我们可以一起来学习一下C语言的编译链接以及预处理的知识。 🌺要谈到C语言的编译和链接就肯定得从我们C语言程序运行的时候所产生的诸多的文件类型了。我们正常情况下编辑书写代码的文件为 .c 文件,我们的 .c 文件通过遍历…...

基于sprinmgboot实现实习管理系统的设计【源码+论文】
基于sprinmgboot实习管理系统的设计与实现演示摘要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,实习管理也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管…...

动态规划入门
前言:首先,什么是动态规划? 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思…...

day26 SpringBootWeb案例(二)
目录 SpringBootWeb案例 1. 新增员工 1.1 需求 1.2 开发 1.3 测试 2. 文件上传 2.1 简介 2.2 本地存储 2.3 阿里云OSS 3. 配置文件 3.1 Value 3.2 yml配置 3.3 ConfigurationProperties 4. 修改员工 4.1 需求 4.2 查询回显 4.3 保存修改 SpringBootWeb案例 前…...

力扣-《剑指offer》-哈希表-刷题笔记
目录 第一题:03.数组中重复的数字 第二题:39.数组中出现次数超过一半的数字 第三题:50.第一个只出现一次的字符 第四题:53. (0-n-1)中缺失的数字 第一题:03.数组中重复的数字 我的答案&…...

【SpringBoot】| 邮箱发送验证码,你会了吗?
目录🦁 题外话🦁 提前准备2.1 配置邮箱第三方登录2.1.1 点击设置——账户2.1.2 开启POP3/SMTP服务2.2 添加依赖2.3 yaml配置🦁 进入主题🦁 测试使用🦁 尾声3.1 安利一个生成验证码的工具类3.1.1 添加依赖3.1.2 编写配置…...

Linux系统安装部署及配置Grafana
TOC 用于 UI 展示 wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpm1 安装 grafana 1.1 下载安装 wget https://dl.grafana.com/oss/release/grafana-8.0.3-1.x86_64.rpmsudo yum install grafana-8.0.3-1.x86_64.rpm1.2 启动&状态查看 sudo syst…...
Python3 入门教程||Python3 输入和输出||Python3 File 方法
Python3 输入和输出 在前面几个章节中,我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 输出格式美化 Python 两种输出值的方式: 表达式语句和 print() 函数。(第三种方式是使用文件对象的 write() 方法; 标准输出文件可以…...
有效的字母异位词(力扣刷题)
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car" 输出: false 说明: 你可以假设字符串只包含小写字母。 …...

73、介绍下 HashMap 的底层数据结构
73、介绍下 HashMap 的底层数据结构 我们现在用的都是 JDK 1.8,底层是由“数组链表红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组链表”组成。 1.Hash Hash叫做”散列表“,就是把任意长度的输入,通过散列算法&am…...

系统集成路由器OSPF动态、综合路由配置
实验任务:动态路由协议RIP、OSPF协议的内容和特点动态路由RIP、OSPF实验,建立拓扑pc1>>R1>>R2>>R3>>pc2,使pc1与pc2能相互通信,并配置PC端静默接口。熟悉配置vlan间路由技术:多层交换机虚拟接…...

【力扣周赛 338】
6354. K 件物品的最大和 - 力扣(Leetcode)袋子中装有一些物品,每个物品上都标记着数字 1、0或 -1。给你四个非负整数 numOnes、numZeros、numNegOnes和 k。袋子最初包含:numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。…...

大数据Flink进阶(八):Apache Flink架构介绍
Apache Flink架构介绍 一、Flink组件栈 在Flink的整个软件架构体系中,同样遵循这分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。...

Mars3d项目启动上的一些坑
前言 最近新入职了一家公司,公司新开了有个未来城市的项目,需要用到3D城市建模,公司老总选了Mars3d作为前端框架,项目分给我了,又是一个全新的领域,开搞吧! 下面是自己遇到的几个小问题&#x…...

通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)
文章目录一.单文件下载1.简单理解文件下载2.单文件下载的具体代码实现3.测试4.单文件下载整体代码二.多文件批量下载(多个文件合成一个压缩包下载)1.多文件下载的实现方式,这里使用了ZipOutputStream2.具体代码实现3.测试4.文件批量下载&…...

CnOpenData中国行政区划shp数据
一、数据简介 中国行政区划数据是重要的基础地理信息数据,目前不同来源的全国行政区划数据非常多,但能够开放获取的高质量行政区域数据少之又少。基于此,锐多宝的地理空间制作一套2013-2023年可开放获取的高质量行政区划数据。该套数据以2022…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...