- 博客(34)
- 收藏
- 关注
原创 帧是如何在互联网中转发的呢
以太网mac帧是知道对面主机的IP地址的,所以在IP数据报中,目的主机和源主机的IP地址在网络中转播是不变的,在同一局域网中,比如说是交换机构成的交互式以太网,通过自学习算法知道自己的转发表(MAC地址和转发端口的映射关系),既然知道了目的主机的IP地址,就把目的主机的IP地址和自己的IP地址的网络前缀作比较,发现不是在一个局域网下的话,就把此MAC帧发送给自己的局域网的网关(就是路由器的接口IP地址,这个是以及知道的,配置的时候会进行默认网关的配置),如果不知道自己网关的MAC地址的话就会通过一个地址解析
2024-10-04 19:09:55 119
原创 SQL中如何进行 ‘’撤销‘’ 操作-详解
在 SQL 中,撤销已经执行的操作通常涉及两个主要的概念:事务控制和回滚操作。### 1. 事务控制在支持事务的数据库管理系统(如 MySQL 的 InnoDB 引擎)中,您可以使用事务来确保数据的完整性。事务可以确保一系列的操作要么全部成功,要么全部失败。COMMIT;ROLLBACK;### 2. 回滚操作如果您已经执行了一些更改(例如,通过 `INSERT`、`UPDATE` 或 `DELETE` 语句),并且希望撤销这些更改,您可以使用 `ROLLBACK` 语句。
2024-10-03 22:24:33 967
原创 数据库中 级联 详解
一:创建完成表之后添加外键并设置 级联 行为在 MySQL 中,当您向一个表中添加外键约束时,这个外键会引用另一个表(称为父表)中的唯一值(通常是主键)。外键约束的主要目的是维护引用完整性,确保在子表(包含外键的表)中的数据在父表(被引用的表)中都有对应的值。如果您在添加外键时没有指定特定的 `ON UPDATE` 和 `ON DELETE` 行为,那么默认的行为将是:1. **`ON DELETE NO ACTION`** 或 **`ON DELETE RESTRICT`**:这意味着如果您尝
2024-10-03 20:37:05 687
原创 内连接的两种写法
这个查询会返回`table1`的所有记录,如果`table2`中有匹配的记录,则一并返回;这个查询会返回`table2`的所有记录,如果`table1`中有匹配的记录,则一并返回;这个查询会返回`table1`和`table2`的所有记录,无论是否有匹配的记录。- 如果一行在其中一个表中有匹配的行,而在另一个表中没有匹配的行,则结果集中该行的另一个表的字段将为NULL。- **可读性**:`INNER JOIN`的写法更清晰,更易于理解,尤其是对于复杂的查询和多表连接。
2024-09-30 19:56:17 540
原创 结构体命名的几种方式
在这个例子中,`Employee` 就是结构体的标签,你可以在其他结构体定义中再次使用 `struct Employee` 来引用这个类型。在定义结构体时,可以给结构体一个标签(也就是结构体的名称),然后在不同的结构体定义中使用相同的标签来表示相同的数据类型。在这个例子中,`Employee` 就是结构体的新类型名,之后你可以使用 `Employee` 来声明变量。在这个例子中,结构体没有标签,因此它只能在定义它的范围内使用,例如作为数组的元素或另一个结构体的成员。
2024-09-09 15:09:12 216
原创 匿名对象-详解
这里 `{"apple", "banana", "cherry"}` 是一个初始化列表,它创建了匿名的 `std::string` 对象。在这个例子中,`getName()` 函数返回的是一个匿名的 `std::string` 对象,它被拷贝到变量 `name` 中。这里的 `lambda` 是一个匿名函数对象,它捕获了外部作用域中的变量,并在定义它的地方立即使用。临时对象是在表达式中创建的,没有名字的对象。在这里,构造函数使用一个匿名 `std::string` 对象来初始化成员变量 `data`。
2024-09-07 18:29:09 234
原创 内联函数-详解
内联函数的代码在调用点展开,这意味着在调试时,你可以在调用点直接查看函数内部的变量和逻辑,这有助于调试和理解代码。对于类的成员函数,尤其是那些只访问或修改成员变量的简单函数,使用内联可以提高访问效率。- 内联函数并不总是提高性能,如果函数体较大,内联可能会导致代码膨胀,反而降低缓存命中率,影响性能。### 2. **提高访问成员变量的效率**### 3. **避免函数调用的额外开销**### 1. **减少函数调用开销**### 4. **模板函数的内联**### 5. **简化调试过程**
2024-09-07 16:25:51 254
原创 STL中for_each() 函数详解
例如,如果你的容器是 `std::deque<int>`,那么 `_func` 应该接受一个 `int` 类型的参数。在每种情况下,`std::for_each` 都会遍历 `std::deque` 中的每个元素,并将每个元素作为参数传递给 `_func`。- 一个函数对象 `Print`,它重载了 `operator()` 并打印传入的 `int` 参数。- 一个普通的函数 `print`,它接受一个 `int` 参数并打印它。- 一个 Lambda 表达式,它接受一个 `int` 参数并打印它。
2024-09-06 22:22:50 369
原创 内部连接性和外部链接性
在C++中,全局变量和静态全局变量的连接性(Linkage)决定了它们在不同编译单元(通常是不同的源文件)中的可见性。- 如果一个全局变量或函数在头文件中声明,并且没有使用`static`关键字,那么它具有外部连接性,可以在多个源文件中被引用。- 使用`static`关键字声明的全局变量或函数具有内部连接性,这意味着它们只能在定义它们的编译单元内被访问。- 使用`static`关键字的全局变量具有内部连接性,只能在定义它们的编译单元中访问。- 全局变量默认具有外部连接性,可以在多个编译单元中访问。
2024-09-01 16:46:52 159
原创 C++中变量初始化规则
全局变量和静态全局变量(在函数外部声明的变量)会被自动初始化为零值。对于基本数据类型,这意味着整型和枚举类型会被初始化为0,浮点类型会被初始化为0.0,`bool`类型会被初始化为`false`,而指针类型会被初始化为`nullptr`。- 静态局部变量只会在程序的第一次执行到声明它们的代码块时被初始化一次,并且它们的生命周期会持续到程序结束。在C++中,为了确保变量的值是可预测的,最好总是显式地初始化变量。- 类的静态成员变量在程序启动时初始化,并且它们的生命周期贯穿整个程序的运行期间。
2024-09-01 16:39:13 204
原创 声明,初始化,赋值三者之间的区别
在不同的编程语言中,声明、初始化和赋值的语法可能会有所不同,但基本概念是通用的。` 声明并初始化了一个名为 `x` 的整型变量,其初始值为 `5`。` 声明了一个名为 `x` 的整型变量,但此时 `x` 的值是未定义的。` 是一个赋值操作,它将变量 `x` 的值设置为 `10`。- **声明**:告诉程序变量的类型和名称,为变量分配内存空间。- **初始化**:在声明变量时或声明后立即给变量一个初始值。- **赋值**:在变量声明后,根据需要给变量赋予新的值。- 赋值是给已经声明的变量赋予一个新的值。
2024-09-01 16:37:24 316
原创 extern关键字的用法
使用`extern`的目的是在当前的文件中告知编译器该变量或函数的定义存在于程序的其他地方,这样编译器在编译当前文件时就能够识别并链接到这些外部定义。- `extern`关键字是可选的,如果一个变量或函数在当前文件中没有定义,但编译器知道它在其他地方定义,那么即使不使用`extern`,编译器也会链接到正确的定义。- 在头文件中使用`extern`是常见的做法,这样所有包含该头文件的源文件都会知道变量或函数的存在,而实际的定义只需在一个源文件中进行。- `extern`声明不能指定初始化。
2024-08-25 20:34:52 115
原创 条件编译的用法
作用:如果前面的`#if`或`#elif`表达式为假,且当前的`#elif`表达式为真,则编译`#elif`和`#endif`之间的代码块。- 作用:如果前面的所有`#if`和`#elif`表达式都为假,则编译`#else`和`#endif`之间的代码块。- 作用:标记`#if`、`#ifdef`、`#ifndef`或`#elif`条件编译块的结束。- 作用:如果指定的宏已经被定义,则编译`#ifdef`和`#endif`之间的代码块。- 语法:`#pragma 编译器指令`
2024-08-25 16:10:24 362
原创 C语言的宏定义
宏定义是C语言中一种预处理指令,它使用`#define`关键字来创建一个宏名,并将其关联到一系列的替换文本上。宏定义允许你将一段代码或常量值定义为一个单一的标识符,这样在代码中就可以通过使用这个标识符来代替较长的表达式或代码块。宏定义是C语言中一个强大的工具,可以提高代码的可读性、可维护性和灵活性。- 宏定义不应该包含函数调用或复杂的表达式,因为这可能导致意外的行为或难以调试的问题。- 使用宏时要注意避免重复定义和未定义宏的使用。定义一段代码,以简化重复代码的使用。定义类似函数的宏,可以接受参数。
2024-08-25 16:07:40 317
原创 为什么要配置环境变量
配置环境变量是一种让操作系统知道如何找到和使用软件及其依赖项的方法。通俗来说,环境变量就像是操作系统的“备忘录”,里面记录了一些重要的信息,帮助操作系统和软件程序知道去哪里找它们需要的东西。6. 跨平台兼容性:不同的操作系统可能有不同的路径格式和环境变量设置方式,配置环境变量有助于软件在不同平台上的兼容性。5. 简化命令行操作:通过设置环境变量,可以在命令行中使用简短的命令来执行复杂的操作,而不需要每次都输入完整的路径。8. 灵活性和可配置性:环境变量提供了一种灵活的方式来配置软件的行为,而无需修改代码。
2024-08-09 17:24:55 747
原创 c++编程 在函数的调用或返回值为对象时如何优化
2. 引用返回(Return by Reference): 返回对象的引用通常不是一个好的做法,因为它可能会引起悬挂引用问题(如果返回的是一个局部对象的引用,那么在函数返回后,局部对象的生命周期就结束了)。3. 指针返回(Return by Pointer): 返回一个指向对象的指针可以避免拷贝构造函数的调用,但这需要额外的内存分配(使用 new 操作符)和后续的内存释放(使用 delete 操作符)。如果函数的返回值是一个临时对象,并且该对象可以被“移动”,编译器将调用移动构造函数来避免不必要的复制。
2024-08-09 00:11:08 357
原创 什么是镜像
3. 容器镜像:在容器技术中,容器镜像是一个轻量级的、可执行的软件包,包含了运行一个应用程序所需的所有内容(代码、运行时、库、环境变量和配置文件)。Docker 镜像就是一个常见的容器镜像例子。2. 虚拟机镜像:在虚拟化技术中,虚拟机镜像是一个预配置的虚拟机环境,包含了操作系统、应用程序和配置设置。5. 软件分发镜像:在软件开发和分发中,软件镜像可以是一个服务器上的软件包集合,用于快速分发软件更新或安装包。4. 备份镜像:在数据备份和恢复领域,备份镜像是数据的副本,可以在原始数据丢失或损坏时使用。
2024-08-05 21:10:28 230
原创 C++内存分配模型
每种存储区都有其特定的用途和特性,程序员需要根据需要选择合适的存储区来存储数据。例如,全局变量和静态变量通常用于在函数之间共享数据,而局部变量则用于存储只在单个函数调用期间需要的数据。- 生存周期:由程序员控制,使用 `new` 或 `malloc` 等分配,使用 `delete` 或 `free` 释放。在C和C++程序中,代码数据可以存储在多个不同的内存区域,每个区域都有其特定的用途、生存周期和读写权限。- 读写权限:可写(初始化时通常设置为0),不可读(未初始化前)。
2024-07-25 14:47:34 250
原创 数组和指针的区别
在这个例子中,`dynamicCharArray` 是一个指针,指向在堆上分配的内存。如果指针指向的是字符串字面量,那么这个字符串是存储在只读内存区域的,不能被修改。你可以修改这个数组中的字符,因为栈内存是可写的。- 字符数组存储的是实际的字符数据,而不是字符数据的引用。因此,当你修改数组中的字符时,你是在修改实际存储在内存中的字符。- 当你使用字符数组时,你实际上是在操作一个存储实际字符数据的内存区域,因此可以修改它。- 由于栈和堆上的内存都是可写的,字符数组可以存储可修改的字符串。
2024-07-25 14:45:50 615
原创 QEvent类在Qt框架中的作用与特性(ai对话)
Kimi: 是的,当Qt中的事件被产生后,`QApplication` 类的 `notify` 方法会被调用。这个方法是 `QCoreApplication` 类中的一个虚函数,`QApplication` 继承了 `QCoreApplication` 并重写了 `notify` 方法。1. **事件类型**:QEvent类定义了一个枚举类型`Type`,列出了所有可能的事件类型,例如`QEvent::MouseButtonPress`、`QEvent::KeyPress`等。
2024-06-19 09:53:13 374
原创 Qt中的事件处理器
Qt中的事件处理器是自动调用的。Qt 使用事件驱动的编程模型,这意味着应用程序的执行流程是由各种事件(如键盘敲击、鼠标点击、定时器事件等)触发的。当这些事件发生时,Qt 事件系统会自动捕获它们,并将它们分派给相应的事件处理器。你可以通过重写基类中的事件处理器方法来处理特定的事件。例如,如果你想要自定义键盘事件的处理,你可以在你的类中重写。这种自动的事件分派机制是Qt框架的核心特性之一,它使得编写响应用户输入和其他事件的应用程序变得更加容易和高效。方法启动)负责接收事件,并将它们分派给适当的事件处理器。
2024-06-18 09:47:02 268
原创 C++标准库(`std`命名空间)
2. 容器相关函数:`vector`, `list`, `map`, `set`, `unordered_map`, `unordered_set`等容器的操作函数,如`push_back()`, `pop_back()`, `insert()`, `erase()`, `begin()`, `end()`等。5. 数学函数:`sqrt()`, `pow()`, `sin()`, `cos()`, `tan()`, `abs()`, `ceil()`, `floor()`, `round()`等数学函数。
2024-06-04 14:11:13 327
原创 string容器的常用方法
是 C++ 标准库中的一个字符串容器,提供了许多方便的方法来操作字符串。中一些常用的方法,可以帮助你进行字符串的操作和处理。
2024-06-04 09:21:28 273
原创 QT中exec()和 show()函数的区别
则以非模态方式显示对话框并不会阻塞程序执行。你可以根据需求选择使用哪种方式来显示对话框。以模态方式显示对话框并阻塞程序执行,而。
2024-05-14 16:17:51 596 1
原创 auto关键字自动类型推导--c++11新特性
是一个关键字,用于告诉编译器根据变量初始化表达式的类型来推断变量的类型。它允许程序员编写更简洁、更易读的代码,特别是在处理复杂的类型或使用模板时。关键字可以使代码更具可读性和灵活性,并减少了需要显式指定变量类型的情况。关键字通常与初始化表达式一起使用,它可以推断出初始化表达式的类型并将其应用于变量。也可能降低代码的可读性,因此需要适度使用。
2024-05-13 10:24:37 341 1
原创 lambda表达式
匿名函数,也称为 lambda 表达式,是一种在代码中内联定义函数的方式,不需要给函数命名,通常用于简化代码并在需要时定义和使用一次性的函数。在 C++11 及更高版本中,lambda 表达式已经成为了一种常用的语法特性。在你提供的代码中,lambda 表达式被定义但没有被调用执行,因为缺少了函数调用运算符。在 C++ 中,lambda 表达式本身是一个对象,要执行它,需要使用函数调用运算符。我是一个匿名函数"。在 lambda 表达式中,可以使用捕获列表。,并在函数体内部使用它们来计算它们的和。
2024-05-13 10:10:46 123 1
原创 c++中的隐式转换
隐式转换是指编程语言在需要时自动进行的类型转换,而无需显式地指定转换操作。虽然隐式转换方便,但也可能引发一些意外的行为,因此在使用时需要注意隐式转换可能带来的潜在问题。
2024-05-11 15:29:06 215 1
原创 c++中临时对象得理解
临时对象是在程序执行期间临时创建的对象,通常用于存储表达式的结果或者作为参数传递给函数。它们在使用完毕后通常会被立即销毁,因此也被称为临时值或匿名对象。临时对象的创建和销毁是由编译器自动管理的,无需程序员手动分配或释放内存。它们的生命周期通常仅限于包含它们的表达式或语句块。虽然临时对象的使用方便,但过多的临时对象可能会增加程序的开销,因此在设计代码时应尽量避免不必要的临时对象的创建。
2024-05-11 15:28:07 207 1
原创 C++的 auto关键字如何用
当你想要声明一个变量,但不确定它的确切类型是什么时,可以使用。循环等情况下特别有用。这在模板编程、迭代器和范围。这样,我们就可以通过。
2024-05-07 19:13:37 215
原创 C++ 多态实现的原理
类B没有自己的fun2()函数,因此在类B的虚函数表中保存的就是A::func2()的地址,这样,即便pa指向类B的对象,"pa->fun2();每一个有虚函数的类(或者有虚函数的派生类)都有一个虚函数表,该类的任何对象中都存放着该虚函数表的指针(也就是上文提到的vfptr指针,可以认为它是由编译器自动添加到构造函数中的指令生成的)。实际上,任何有虚函数的类以及派生类的对象都包含这多出来的4个字节,这4个字节就是实现多态的关键--它位于对象存储空间的最前端,其中存放的是虚函数表的地址。
2024-05-03 16:06:53 395
原创 c语言做大项目如何管理多个文件模块
文件包含(include)并不是新的内容。编写程序时,都会在程序头写上:文件包含的作用是把指定的文件模块内容插入到#include所在的位置,当程序编译连接时,系统会把所有#include指定的文件拼接生成可执行代码。文性包含必须以进开头,这表示编译预处理命夺。它将在程序编译时起作用,把指定的文件模块包含进来,当经过连接生成可执行代码后,include 便不再存在。因此 include 不是真正的C语句,行尾不用分号结束。文件包含的格式为:#include<需包含的文件名>或。
2024-04-16 21:22:14 969
原创 liunx 进程基础知识,进程的创建
如果是学过操作系统应该可以很好理解的,我们首先要理解程序的定义:首先程序是指一个指令序列。为了方便操作系统(下面称OS)管理,完成程序并发执行,引入了进程,进程实体的概念。OS为每一个运行的程序配置一个数据结构称为程序控制块(PCB)用来描述进程的各种信息。进程实体概念请看下图:知道了进程的基本概念之后,我们要了解进程的状态和转换:进程主要有三个状态:就绪态,运行态,阻塞态;下面是对状态转换解释,注意事项。
2024-04-14 13:32:47 1021 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人