当前位置: 首页 > news >正文

C++中const和constexpr的区别:了解常量的不同用法

C++中const和constexpr的区别

  • 一、C++中的常量概念
  • 二、const关键字的用法和特点
  • 三、constexpr关键字的用法和特点
  • 四、const和constexpr的区别对比
    • 4.1、编译时计算能力
    • 4.2、可以赋值的范围
    • 4.3、对类和对象的适用性
    • 4.4、对函数的适用性
    • 4.5、性能和效率的差异
  • 五、使用示例
  • 六、总结

一、C++中的常量概念

在C++中,常量是指其数值或数值引用在程序执行期间不能被改变的变量。常量可以在程序中用来定义一些固定不变的值,如数学常数、固定参数等。在C++中,有两种主要类型的常量:const和constexpr。

const常量概念:

  • 使用关键字const声明的常量,一旦赋值后便不能修改其数值,具有只读属性。
  • 可以作用于变量、指针、引用以及成员函数的参数,保证其在函数内部不会被修改。
  • const在编译时起作用,但是不一定要进行常量表达式的计算。

constexpr常量概念:

  • 使用关键字constexpr声明的常量,必须在编译时期计算出结果,并且其值在编译时即可确定。
  • 可以用于定义常量、函数等,通常用于要求在编译时仅使用常量表达式的场景。
  • constexpr在C++11之后引入,可用于进行更严格的编译时检查和优化。

const关键字的作用:

  • 声明一个常量,即其数值在程序执行期间不能被改变。
  • 可以用于定义普通变量、类成员变量、函数参数等,使其成为只读变量。
  • 通过const修饰能够避免意外的数值修改。

constexpr关键字的作用:

  • 声明一个常量表达式,要求在编译时期计算出结果,以产生一个编译时常量。
  • 可以用于定义常量、函数等,通常用于需要在编译时进行计算的场景,例如数组大小、模板参数等。
  • constexpr在C++11中引入,能够进行更严格的编译时检查和优化,在部分情况下可以提高程序性能。

二、const关键字的用法和特点

两种方式来声明和定义const变量:

  1. 通过变量声明和定义分开的方式(用于在多个文件之间共享const变量):

    // 声明const变量
    extern const int myConst; // 声明一个外部链接的const变量// 在另一个文件中定义const变量
    const int myConst = 10;
    
  2. 直接声明和定义const变量:

    // 声明并定义const变量
    const int myConst = 10;
    

const 成员函数表示该函数不会修改对象的成员变量,这样的函数可以被 const 对象调用。

示例:

class MyClass {
public:void regularFunction() {// 正常的成员函数定义_val = 1;}void constFunction() const {// const 成员函数定义// 在 const 成员函数中不能修改对象的成员变量}
private:int _val;
};

一旦将一个成员函数声明为 const,那么这个函数就不能对对象的成员变量进行任何修改操作。

const修饰符还可以用于引用和指针类型,以表明它们指向的数据是常量,不能被修改。

const引用:可以通过在引用声明中添加const修饰符来创建const引用,如下所示:

int x = 10;
const int& ref = x;  // 创建一个指向常量的引用

const指针:同样地,在指针声明中添加const修饰符可以创建const指针,如下所示:

int y = 20;
const int* ptr = &y;  // 创建一个指向常量的指针

还可以这样声明指向常量的指针:

int z = 30;
int* const ptr2 = &z;  // 创建一个常量指针

const在编译时的作用:

  1. 如果一个变量被声明为const,则编译器可以将其视为一个常量表达式,从而在编译时进行优化。即编译器可以在编译期间进行常量折叠和替换,而不必在运行时再去计算这个值。

  2. 编译时类型检查:使用const可以将变量声明为只读,确保在编译时不会发生意外的修改。如果尝试在const变量上进行写操作,编译器会报错。

  3. const修饰指针和引用时,可以指示指针和引用所指向的内容为常量,这样可以在编译时进行一定的错误检查。

const的限制:

  1. 常量必须进行初始化:一个变量被声明为const,它必须在声明时进行初始化,否则编译器会报错。这是因为const在C++中被设计为一种“一旦赋值,不可更改”的特性。

  2. 对于const指针或引用来说,虽然它们指向的值是不可修改的,但是它们本身并不是常量。因此,可以通过改变指针或引用的指向来改变它们指向的值,这个要非常小心。

const的适用场景:

  1. 固定不变的数值或变量时,可以将其声明为const,以确保这些值在程序的执行过程中不会被修改。

  2. 将函数的参数声明为const可以确保函数内部不会对参数进行修改,同时向调用者明确表明函数的行为。

  3. 在编译时进行常量折叠和替换。

三、constexpr关键字的用法和特点

constexpr关键字用于声明变量和函数为编译时常量表达式。它可以用于在编译时求值,以及在运行时提供常量值。

constexpr变量的语法:

constexpr type variable_name = value;

其中,type表示变量的类型,variable_name表示变量的名称,value表示变量的初始值。重点注意的是,value必须是一个常量表达式,必须在编译时就可以确定。

示例:

constexpr int width = 10; // 声明一个constexpr变量

constexpr函数的语法:

constexpr return_type function_name(parameters) {// 函数体return value;
}

return_type表示函数返回值的类型,function_name表示函数的名称,parameters表示函数的参数列表,value表示函数的返回值。重点注意的是,constexpr函数的参数和返回值类型必须是能够在编译期间确定的常量表达式。

示例:

constexpr int square(int x) {return x * x;
}

注意:在C++14之前,constexpr函数的函数体通常被要求是非常简单的,例如只有一条return语句。但是在C++14中放宽了这一限制,允许constexpr函数包含有限的控制流、局部变量和循环。

constexpr变量的特点:

  • 通过使用constexpr关键字,变量可以在编译时求值,其值在编译期间就已经确定。
  • constexpr变量必须被初始化为常量表达式。
  • constexpr变量可以作为数组的长度、枚举的值、模板参数等。
  • 与const变量不同,constexpr变量的值在编译时即确定,因此可以作为编译时常量来使用。

示例:

constexpr int width = 10; // 定义一个编译时常量
constexpr int area = width * width; // 定义一个编译时常量表达式

constexpr函数的特点:

  • 通过使用constexpr关键字,函数可以在编译时求值。
  • constexpr函数通常用于执行简单的计算,并且其参数和返回值都必须是能够在编译期间确定的常量表达式。
  • constexpr函数可以在编译时被用作模板参数。

示例:

constexpr int square(int x) {return x * x;
}

前面说了这么多constexpr在编译时的注意事项,这里再总结一下constexpr在编译时的作用:

  1. 常量表达式的求值:constexpr关键字告诉编译器,变量或函数的值可以在编译时求值。即编译器会在编译阶段计算constexpr变量和函数的值,而不是在运行时。这可以在一定程度上提高程序的性能,因为编译时求值的常量表达式可以避免在运行时进行重复的计算。

  2. 编译时的优化:使用constexpr可以让编译器在编译时对代码进行更多的优化。例如,编译器可以在编译期间内联constexpr函数,消除不必要的计算,以及在一些情况下将表达式简化为常量。这可以提高程序的执行效率,并减少运行时的开销。

constexpr的限制:

  1. constexpr函数必须是单一返回语句,并且该语句必须返回一个常量表达式。
  2. constexpr函数在C++11中还有更多的限制,例如不能包含循环、局部变量和复杂的控制流,但在C++14中这些限制已经有所放宽。
  3. constexpr变量必须在声明时进行初始化,并且初始化表达式必须是常量表达式。

constexpr的适用场景:

  1. 当变量的值在编译时已知,并且永远不会改变时,可以使用constexpr变量。这对于一些数学常数或者其他不变的配置参数非常有用。
  2. 当函数需要在编译时进行计算,并且其参数和返回值都是常量表达式时,可以使用constexpr函数。这可以用于在编译时生成特定的值或序列,避免在运行时进行重复的计算。
  3. constexpr还可以用于模板编程中,特别是对于元编程和编译时计算相关的需求。

四、const和constexpr的区别对比

4.1、编译时计算能力

const:

  1. const关键字用于声明常量,它指定了一个变量的值在程序执行期间不能被修改。在编译时,const常量的值是不可更改的,但并不要求其在编译时进行计算。
  2. 由于const变量的值在运行时不能被改变,因此编译器会将const变量存储在只读存储区域中,但并不要求其在编译时进行计算。

constexpr:

  1. constexpr关键字用于声明常量表达式,它要求变量或函数在编译时就能得到计算结果。
  2. 对于constexpr变量,编译器会在编译期间进行常量表达式的求值,而不是在运行时。这意味着constexpr变量的值必须在编译时就能确定。
  3. 同样地,constexpr函数在编译时执行,并且其参数必须是常量表达式,返回值也必须是常量表达式。

示例 1:const

#include <iostream>
using namespace std;int main() {const int x = 5;const int y = x + 3;cout << y << endl;return 0;
}

定义了一个 const 变量 x,并将其值设为 5。然后又定义了一个 const 变量 y,并将其设为 x + 3。这里的 x 和 y 都是在运行时确定的,因此编译器会在程序运行时对 y 的值进行计算。

示例 2:constexpr

#include <iostream>
using namespace std;int main() {constexpr int x = 5;constexpr int y = x + 3;cout << y << endl;return 0;
}

constexpr 来定义 x 和 y。在这种情况下,编译器会在编译时就计算出 y 的值,因为 x 和 3 都是在编译时就可以确定的常量。因此,y 的值在编译时就被确定了。

小结:const和constexpr在编译时计算能力上的区别在于const仅指示变量的值在运行时不可修改,而constexpr则要求在编译时进行常量表达式的计算。constexpr更适用于那些需要在编译时确定值或进行编译时计算的场景,而const更适用于普通的常量声明。

4.2、可以赋值的范围

const:

  1. const 可用于声明常量,可以赋值给任何类型的变量,包括全局变量、局部变量、类的成员变量和函数参数。
  2. 可以通过 const 指针指向常量或者通过 const 引用绑定到常量对象,但这些常量本身可以在编译时或者运行时进行初始化。

constexpr:

  1. constexpr 可以用于声明常量,可以赋值给变量、函数、模板参数和构造函数的初始化器。
  2. 在 C++11 中,constexpr 主要用于声明常量,而在 C++14 中,constexpr 进一步扩展到了函数,允许对常量表达式进行计算。
  3. constexpr 也可以用于指针和引用,但是需要指向或者引用在编译时就能确定其值的对象。

const 可以用于声明各种类型的常量,并且可以用于指针和引用的限制不是很严格;而 constexpr 主要用于声明常量,同时还可以用于指示编译时计算。constexpr 在赋值的范围上更加灵活,特别是在 C++14 中的扩展。

4.3、对类和对象的适用性

const:

  1. const 可以用于成员函数的声明,表示该函数不会修改对象的成员变量。同时,const 成员函数可以被一个 const 对象调用,但不能修改其成员变量。
  2. const 对象可以调用对象的 const 成员函数,但不能调用非 const 成员函数,确保对象的成员变量不被修改。

constexpr:

  1. constexpr 关键字在类的成员函数中表示该函数可以在编译时求值,可以用于构造函数、成员函数和类的静态成员函数。
  2. 对于构造函数,可以使用 constexpr 来声明编译时可求值的构造函数,要求构造函数中只能包含编译时可计算的操作。
  3. constexpr 成员函数可以在编译时求值,适用于一些固定值的计算,在 C++14 中可以用 constexpr 成员函数替换类中的静态常量成员。

当涉及到赋值的范围,const 和 constexpr 也有一些不同。让我们通过示例来说明这一点。

示例 1:const

#include <iostream>
using namespace std;int main() {const int x = 5;const int* ptr = &x; // 指向常量的指针cout << *ptr << endl;*ptr = 10;  // 编译器会报错,因为指针指向的是一个常量return 0;
}

示例 2:constexpr

#include <iostream>
using namespace std;int main() {constexpr int x = 5;constexpr int* ptr = &x;cout << *ptr << endl;*ptr = 10;  // 编译器会报错,因为指针指向的是一个常量return 0;
}

小结:const 主要用于指示对象或者成员函数不可修改,限定对象的只读访问行为,而 constexpr 用于指示在编译时可以进行求值的场景,特别适用于一些对值就能确定的操作。constexpr 对于类和对象的适用性更加注重在编译时进行的操作,而 const 更多是关于对象的只读性质。

4.4、对函数的适用性

const:

  1. const 可以用于函数参数和函数返回值的声明。在函数参数中,const 可以表示该参数不会被修改;在函数返回值中,const 可以表示返回的值为常量。
  2. const 成员函数可以用于表示该函数不会修改对象的成员变量,在类中通过 const 关键字来声明成员函数,以确保其在调用过程中不会修改对象的状态。

constexpr:

  1. constexpr 可以用于函数声明,表示该函数可以在编译时求值。在 C++11 中,constexpr 主要用于常量表达式,而在 C++14 中,扩展到了允许对更复杂的函数进行编译时求值。
  2. 在 C++14 中,constexpr 还可以用于标记类的成员函数,以及构造函数和析构函数,表示在编译时就能确定其值或者执行结果的函数。

示例 1:const

#include <iostream>
using namespace std;void printMessage(const string& msg) {cout << msg << endl;
}int main() {const string message = "Hello, world!";printMessage(message);return 0;
}

示例 2:constexpr

#include <iostream>
using namespace std;constexpr int square(int x) {return x * x;
}int main() {constexpr int num = 5;constexpr int result = square(num);cout << result << endl;return 0;
}

小结:const 主要用于标记函数参数和返回值的常量性质,以及在类中用于声明不会修改对象状态的成员函数;而 constexpr 则主要用于表示可以在编译时求值的函数,适用于对一些值在编译时就能确定的操作。constexpr 对于函数的适用性更加注重在编译时进行的操作,而 const 则更多用于标记常量性质。

4.5、性能和效率的差异

const和constexpr的主要区别在于编译时进行的操作和值的确定性。

const:

  • const 定义的常量在运行时是不可修改的,但它的值是在运行时确定的。
  • const 变量的值在编译时可能无法确定,因此每次使用时都需要进行运行时计算。
  • 当 const 变量被频繁地使用并且其值是运行时计算得到的时候,const 可能会导致性能下降。

constexpr:

  • constexpr 在编译时就能确定其值,因此可以用于在编译时进行计算。
  • 使用 constexpr 可以提高程序的性能和效率,因为它在编译时就能确定值,而不需要在运行时进行计算。
  • constexpr 变量可以在编译时被替换为其确定的值,这样可以减少程序运行时的开销。

示例 1:const

#include <iostream>
#include <vector>
using namespace std;void printVector(const vector<int>& vec) {for (const int& num : vec) {cout << num << " ";}cout << endl;
}int main() {const int size = 1000000;vector<int> numbers;for (int i = 0; i < size; i++) {numbers.push_back(i);}printVector(numbers);return 0;
}

示例 2:constexpr

#include <iostream>
using namespace std;constexpr int square(int x) {return x * x;
}int main() {constexpr int num = 5;constexpr int result = square(num);cout << result << endl;return 0;
}

从性能和效率的角度来看,constexpr 在编译时确定值的特性使得它更有可能比 const 变量更有效率。因为它减少了在运行时进行计算的需要,可以在适当的情况下提高程序的性能。但对于一般的常量定义,使用 const 或者 constexpr 都不会对程序的性能产生显著的影响。

五、使用示例

// 使用 const 定义常量
#include <iostream>
using namespace std;int main() {const int max_value = 100;cout << "The maximum value is: " << max_value << endl;// max_value = 200; // 这行代码会导致编译错误,因为常量不可更改return 0;
}
// 使用 constexpr 定义常量
#include <iostream>
using namespace std;int main() {constexpr int max_value = 100;cout << "The maximum value is: " << max_value << endl;return 0;
}

六、总结

const:

  • const 变量在编译时不一定会被计算出具体的值,它可以是一个运行时才能得到的值。所以,const 变量不能用于需要在编译期间计算值的场合。
  • const 变量可以存储在内存中,并可以被编译器优化。
  • const 变量可以用于任何场合,包括函数参数、类成员等。

constexpr:

  • constexpr 变量必须在编译时期就能得到一个确定的值,其值必须能够在编译时计算得出,所以一般用于需要在编译期确定常量值的场合。
  • constexpr 变量更多的是被视为一个编译时的常量表达式,在一些需要常量表达式的地方必须使用 constexpr。
  • constexpr 允许编译器在编译时进行计算,并且可以在一些上下文中被用于要求常量表达式的场合(比如数组大小、模板参数等)。

常量有不同的用法和适用场景:

  1. const变量:

    • 用法:可以通过const关键字定义一个不可改变的变量,如:const int a = 10;
    • 适用场景:常用于定义一个在程序执行过程中其值不会改变的变量,例如常数、固定参数等。
  2. constexpr变量:

    • 用法:可以使用constexpr关键字定义一个编译时常量,要求在编译时期就能得到一个确定的值。
    • 适用场景:常用于要求在编译期计算得到值的场合,例如定义数组大小、模板参数、常量表达式等。
  3. #define预处理器宏:

    • 用法:可以通过#define指令定义一个常量宏,如:#define PI 3.14159
    • 适用场景:常用于定义一些简单的常量,例如数学常数、特定数值、标志位等。
  4. 枚举类型(enum):

    • 用法:可以通过enum关键字定义一组具名的整型常量,如:enum Week {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
    • 适用场景:常用于定义一组相关的常量,例如星期、状态码等。

在这里插入图片描述

相关文章:

C++中const和constexpr的区别:了解常量的不同用法

C中const和constexpr的区别 一、C中的常量概念二、const关键字的用法和特点三、constexpr关键字的用法和特点四、const和constexpr的区别对比4.1、编译时计算能力4.2、可以赋值的范围4.3、对类和对象的适用性4.4、对函数的适用性4.5、性能和效率的差异 五、使用示例六、总结 一…...

高级架构师是如何设计一个系统的?

架构师如何设计系统&#xff1f; 系统拆分 通过DDD领域模型&#xff0c;对服务进行拆分&#xff0c;将一个系统拆分为多个子系统&#xff0c;做成SpringCloud的微服务。微服务设计时要尽可能做到少扇出&#xff0c;多扇入&#xff0c;根据服务器的承载&#xff0c;进行客户端负…...

力扣:474. 一和零(动态规划)(01背包)

题目&#xff1a; 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#…...

【复现】Apache Solr信息泄漏漏洞_24

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Apache Solr是一个独立的企业级搜索应用服务器&#xff0c;它对外提供类似于Web-service的API接口。用户可以通过http请求&#x…...

《WebKit 技术内幕》之五(4): HTML解释器和DOM 模型

4 影子&#xff08;Shadow&#xff09;DOM 影子 DOM 是一个新东西&#xff0c;主要解决了一个文档中可能需要大量交互的多个 DOM 树建立和维护各自的功能边界的问题。 4.1 什么是影子 DOM 当开发这样一个用户界面的控件——这个控件可能由一些 HTML 的标签元素…...

记录一个sql:查询商品码对应多个商品的商品码

目录 背景sql 语句总结 背景 一个项目中&#xff0c;商品表和商品码表是一对多的关系&#xff0c;但由于程序没有控制好&#xff0c;导致有些商品码对应有多个商品&#xff0c;为了修正数据&#xff0c;我们得把商品码对应多个商品的商品码找出来. sql 语句 goods_detail表结构…...

Linux内核--网络协议栈(三)sk_buff介绍

目录 一、引言 二、sk_buff ------>2.1、skb介绍 ------>2.2、控制字段 ------>2.3、其他字段 ------>2.4、特定功能字段 ------>2.5、管理字段 ------>2.6、内存分配 ------>2.7、内存释放 ------>2.8、克隆和拷贝 ------>2.9、队列管理…...

尝试解决githubclone失败问题

BV1qV4y1m7PB 根据这个视频 似乎是我的linux的github似乎下好了 我没有配置好 比如我的ssh-key 现在根据视频试试 首先需要跳转到ssh的文件夹&#xff1a; cd ~/.ssh 然后生成一个ssh-key&#xff1a; ssh-keygen -t rsa -C "<github资料里的邮箱>" 然后…...

VUE表单中多个el-upload上传组件共享回调函数解决方案

产品需求界面&#xff1a; 在产品配置页面表单中需要上传多个图片&#xff0c;项目中上传组件采用Element Plus 中的 el-upload&#xff0c;目前问题是每个上传组件都需要实现自己的回调&#xff0c;比如:on-change&#xff0c;采用官方推荐标准代码如下&#xff1a; <el-fo…...

Opencv4快速入门笔记

opencv4 一、数据载入显示和储存 1.Mat类 cv::Mat a(640,480,CN_8UC3); //640*480 3通道 cv::Mat a(Size(480,640),CV_8UC1); Mat m a.clone();//克隆 Mat b (a,Range(2,5),Range(3,5));//截取a中2-5行&#xff0c;3-5列 Mat b(2,2,CV_8UC3,Scalar(0,0,255));//构造时赋值…...

three.js 点按钮,相机飞行靠近观察设备

效果&#xff1a; 点击按钮或直接点击模型都可以实现运动效果 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"><…...

什么情况下物理服务器会运行出错?

​  物理服务器&#xff0c;也称为裸机服务器&#xff0c;一般可以提供高性能计算水平和巨大的存储容量。然而&#xff0c;它们也难免会遇到一些问题。运行出错时&#xff0c;可能会导致停机和数据丢失。在这篇文章中&#xff0c;介绍了常见的物理服务器在一些情况下显示出错…...

配置免费的SSL

1 引言 本文介绍了如何在 Linux 环境下使用免费的 Let’s Encrypt 为你的网站配置 SSL 证书的方法&#xff0c;以及如何在 Nginx 服务器中启用 SSL。对于需要在自己的网站上启用 HTTPS 的用户来说非常实用。 2 SSL 简介 SSL&#xff0c;全称为 Secure Sockets Layer&#xf…...

(2)(2.1) Andruav Android Cellular(一)

文章目录 前言 1 Andruav 是什么&#xff1f; 2 Andruav入门 3 Andruav FPV 4 Andruav GCS App​​​​​​​ 前言 Andruav 是一个基于安卓的互联系统&#xff0c;它将安卓手机作为公司计算机&#xff0c;为你的无人机和遥控车增添先进功能。 1 Andruav 是什么&#xff…...

[GN] Vue3.2 快速上手 ---- 核心语法(终章)_3

文章目录 路由器工作模式命名路由to的三种写法嵌套路由路由传参query参数params参数 路由的props配置replace 和 push编程式导航重定向 总结 路由器工作模式 history模式 优点&#xff1a;URL更加美观&#xff0c;不带有#&#xff0c;更接近传统的网站URL。 缺点&#xff1a;后…...

在k8s上部署ClickHouse

概述 clickhouse的容器化部署&#xff0c;已经有非常成熟的生态了。在一些互联网大厂也已经得到了大规模的应用。 clickhouse作为一款数据库&#xff0c;其容器化的主要难点在于它是有状态的服务&#xff0c;因此&#xff0c;我们需要配置PVC。 目前业界比较流行的部署方式有…...

快速入门:使用 Gemini Embeddings 和 Elasticsearch 进行向量搜索

Gemini 是 Google DeepMind 开发的多模态大语言模型家族&#xff0c;作为 LaMDA 和 PaLM 2 的后继者。由 Gemini Ultra、Gemini Pro 和 Gemini Nano 组成&#xff0c;于 2023 年 12 月 6 日发布&#xff0c;定位为 OpenAI 的竞争者 GPT-4。 本教程演示如何使用 Gemini API 创建…...

【网络安全】-入门版

secure 一、基本工具1、metasploit framework ps.本着兴趣爱好&#xff0c;加强电脑的安全防护能力&#xff0c;并严格遵守法律和道德规范。一、基本工具 1、metasploit framework msf&#xff08;metasploit framework&#xff09;是一个开源的渗透测试框架&#xff0c;用于…...

Elasticsearch各种高级文档操作3

本文来记录几种Elasticsearch的文档操作 文章目录 初始化文档数据聚合查询文档概述对某个字段取最大值 max 示例对某个字段取最小值 min 示例对某个字段求和 sum 示例对某个字段取平均值 avg 示例对某个字段的值进行去重之后再取总数 示例 State 聚合查询文档概述操作实例 桶聚…...

【算法题】66. 加一

题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入&#xff1a;…...

查看服务器资源使用情况

查看服务器资源使用情况 一、top命令二、理解IOPS三、腾讯云机器cvm四、iotop五、atop六、查看内存使用情况一、top命令 "top"命令是一个Linux系统的实用工具,用于动态监视系统的运行状态。它会实时显示系统中正在运行的进程列表,并按照CPU使用率、内存使用率等指…...

锐浪报表 Grid++Report 明细表格标题重复打印

一、问题提出 锐浪报表 GridReport&#xff0c;打印表格时&#xff0c;对于明细表格的标题&#xff0c;打开换页时&#xff0c;需要重复打印明细表格的标题&#xff0c;或取消打印明细表格的标题。见下表&#xff1a; 首页&#xff1a; 后续页&#xff1a;&#xff08;无明细表…...

编程笔记 html5cssjs 048 CSS链接

编程笔记 html5&css&js 048 CSS链接 一、设置链接样式二、文本装饰三、背景色四、链接按钮五、练习小结 通过 CSS&#xff0c;可以用不同的方式设置链接的样式。 一、设置链接样式 链接可以使用任何 CSS 属性&#xff08;例如 color、font-family、background 等&…...

Spring DI

目录 什么是依赖注入 属性注入 构造函数注入 Setter 注入 依赖注入的优势 什么是依赖注入 依赖注入是一种设计模式&#xff0c;它通过外部实体&#xff08;通常是容器&#xff09;来注入一个对象的依赖关系&#xff0c;而不是在对象内部创建这些依赖关系。这种方式使得对象…...

CorelDRAW Graphics Suite2024专业图形设计软件Mac/Windows版

以激情为创造动力&#xff0c;以目的为设计导向。“对专业的图形设计人士来说&#xff0c;CorelDRAW 是市面上最易于使用的软件。 我用它设计过标牌、横幅、T 恤&#xff0c;甚至 45 英尺长的房车图形&#xff01;” 使用 CorelDRAW 全新的聚焦模式&#xff0c;现在可以单独编…...

如何本地部署虚拟数字克隆人 SadTalker

环境&#xff1a; Win10 SadTalker 问题描述&#xff1a; 如何本地部署虚拟数字克隆人 SadTalker 解决方案&#xff1a; SadTalker&#xff1a;学习逼真的3D运动系数&#xff0c;用于风格化的音频驱动的单图像说话人脸动画 单张人像图像&#x1f64e; ♂️音频&#x1f3…...

电容充电时间的计算

电容充电时间的计算公式有两种。一种用于已知V0&#xff0c;Vu&#xff0c;Vt&#xff0c;R和C的情况&#xff0c;另一种用于已知E&#xff0c;R和C的情况。 当已知V0&#xff0c;Vu&#xff0c;Vt&#xff0c;R和C时&#xff1a; 设 V0 为电容上的初始电压值设 Vu 为电容充满…...

MicroPython核心(1):源码获取、编译构建

本文介绍了MicroPython在主要平台进行构建的基本方法&#xff0c;包括如何进行版本控制、获取和构建移植的源代码、构建文档、运行测试&#xff0c;以及MicroPython代码库的目录结构。 使用git进行源码管理 MicroPython托管在GitHub上&#xff0c;并使用Git进行源码管理。在进…...

pyspark之Structured Streaming file文件案例1

# generate_file.py # 生成数据 生成500个文件,每个文件1000条数据 # 生成数据格式&#xff1a;eventtime name province action ()时间 用户名 省份 动作) import os import time import shutil import time FIRST_NAME [Zhao, Qian, Sun, Li, Zhou, Wu, Zheng, Wang] SEC…...

虚幻UE 特效-Niagara特效实战-雨天

回顾Niagara特效基础知识&#xff1a;虚幻UE 特效-Niagara特效初识 其他两篇实战&#xff1a;虚幻UE 特效-Niagara特效实战-火焰、烛火、虚幻UE 特效-Niagara特效实战-烟雾、喷泉 本篇笔记我们再来实战雨天&#xff0c;雨天主要用到了特效中的事件。 文章目录 一、雨天1、创建雨…...