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

我的C++奇迹之旅:内联函数和auto关键推导和指针空值

请添加图片描述

文章目录

  • 📝内联函数
  • 🌠 查看内联函数inline方式
    • 🌉内联函数特性
    • 🌉面试题
  • 🌠auto关键字(C++11)
    • 🌠 auto的使用细则
    • 🌉auto不能推导的场景
  • 🌠基于范围的for循环(C++11)
      • 🌠范围for的语法
      • 🌉 范围for的使用条件
  • 🌉 指针空值nullptr(C++11)
    • 🌠C++98中的指针空值
  • 🚩总结


📝内联函数

内联函数是一种编译器优化技术,它可以将函数的代码直接插入到函数调用的地方,而不是通过函数调用的方式。这样可以减少函数调用的开销,提高程序的执行效率。

举个例子,当你在一个项目中,想要频繁调用一个Add函数

int Add(int x, int y)
{return x + y;
}

当你调用一千次,一万次,函数栈帧相应的要建立这么多次,对于代码空间和时间考虑,消耗大,也浪费。
此时,你肯定在想到C语言中的来在代码进行预处理解决

#define ADD(a, b) ((a) + (b))

当然你也要注意括号问题,在使用宏定义时需要格外小心,因为宏定义是在编译时进行替换的,如果定义不当可能会导致一些意料之外的行为,避免出现以下有关括号写法问题:

#define ADD(a, b) a + b;
#define ADD(a, b) (a + b)
#define ADD(int a, int b) return a + b;
这个宏定义是错误的。宏定义中不能包含 return 语句,因为宏展开时会直接替换代码,而不是像函数那样有返回值。

代码测试

#define _CRT_SECURE_NO_WARNINGS 1
#define ADD(a, b) ((a) + (b))
#include <stdio.h>
int main()
{int ret = ADD(1, 2);printf("%d\n", ADD(1, 2));int x = 1, y = 2;printf("%d\n", ADD(x & y, x | y));return 0;
}

C++中,在函数声明前增加inline 关键字来告诉编译器这个函数为内联函数:

inline int Add(int a, int b)
{return a + b;
}

inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。当编译器编译运行到内联函数,将会把函数调用的代码,直接替换,不需要再去Call该函数的地址,然后再通过这个函数的地址去寻找函数的代码,这样可以避免函数调用时建立栈帧的开销,提高程序的运行效率。这在反汇编中汇编代码中操作中有所体现,让我们看看:

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
inline int Add(int begin, int end)
{return begin + end;
}int main()
{int ret = 0;ret = Add(6, 8);return 0;
}

例子中,代码的在前面原本的代码中加多了一个inline,因此这个函数是内联函数,编译器会将main()函数中的Add(6,8)先把6放在在寄存器eax中,然后让8与寄存器eax进行相加,这样的直接操作就实现了函数的相加,相比调用函数开销,提高了程序的运行效率。
这是反汇编对比图:
在这里插入图片描述
在这里插入图片描述

🌠 查看内联函数inline方式

查看内联函数的方式确实需要根据编译模式的不同而采取不同的方法:
在 Visual Studio 2019 中,查看内联函数的步骤如下:

  1. 在 Debug 模式下:

    • 找到项目 -> 属性
    • 在这里插入图片描述
    • -> C/C++ -> 常规-> 调试信息格式 -> 程序数组路库(/Zi)在这里插入图片描述 -
    • -> 选完上面再接着 -> 优化-> 内联函数扩展 -> 直适用于_inline(/Ob1)
    • 在这里插入图片描述
    • 点击确定,然后按下F10,右击鼠标找到反汇编,即可。
    • 在这里插入图片描述
    • 这样在 Debug 模式下也能看到内联函数被展开的汇编代码
  2. 在 Release 模式下:

    • 同样可以查看生成的汇编代码,如果没有看到对应的 call 指令,就说明该函数被内联展开了
      在这里插入图片描述

另外,Visual Studio 2019 还提供了一个更直观的方式来查看内联函数的情况:

  • 在代码编辑器中,将鼠标悬停在内联函数的调用处,Visual Studio 会弹出一个提示框,显示该函数是否被内联展开。
    在这里插入图片描述

🌉内联函数特性

  • inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

  • inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为《C++prime》第五版关于inline的建议:
    在这里插入图片描述

  • inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

  • F.h

#include <iostream>
using namespace std;
inline void f(int i);
  • F.cpp
#include "F.h"
void f(int i)
{cout << i << endl;
}
  • test.cpp
#include "F.h"
int main()
{f(10);return 0;
}

链接错误:main.obj : error LNK2019: 无法解析的外部符号 "cpp void __cdecl f(int)" (?f@@YAXH@Z),该符号在函数 _main 中被引用

🌉面试题

宏的优缺点?
优点:
1.增强代码的复用性。
2.提高性能。
缺点:
1.不方便调试宏。(因为预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 。

C++有哪些技术替代宏?

  1. 常量定义 换用const enum
  2. 短小函数定义 换用内联函数

🌠auto关键字(C++11)

在早期C/C++auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它,大家可思考下为什么?

C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
简言之:使用 auto 声明变量时,编译器会自动推导出变量的类型,无需显式指定。

int TestAuto()
{return 10;
}
int main()
{int a = 10;auto x = 42;       // x 的类型被推导为 intauto y = 3.14;     // y 的类型被推导为 doubleauto z = "hello";  // z 的类型被推导为 const char*auto d = TestAuto();cout << typeid(x).name() << endl;cout << typeid(y).name() << endl;cout << typeid(d).name() << endl;//auto e; 无法通过编译,使用auto定义变量时必须对其进行初始化return 0;
}

在这里插入图片描述

注意:使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型。

🌠 auto的使用细则

  1. auto与指针和引用结合起来使用
    auto声明指针类型时,用autoauto*没有任何区别,但用auto声明引用类型时则必须加&
int main()
{int x = 10;auto a = &x;auto* b = &x;auto& c = x;cout << typeid(a).name() << endl;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;*a = 20;*b = 30;c = 40;return 0;
}

在这里插入图片描述

  1. 在同一行定义多个变量
    当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
int TestAuto()
{auto a = 1, b = 2;auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同return a + b + c + d;
}int main()
{auto d = TestAuto();cout << typeid(d).name() << endl;return 0;
}

在这里插入图片描述

🌉auto不能推导的场景

  1. auto不能作为函数的参数
// 此处代码编译失败,auto不能作为形参类型,因为编译器无法对a的实际类型进行推导
int TestAuto(auto a)
{return a = 1; 
}int main()
{auto d = TestAuto(2);cout << typeid(d).name() << endl;return 0;
}

在这里插入图片描述

  1. auto不能直接用来声明数组
    auto 关键字确实不能直接用来声明数组。这是 C++ 语言的一个特性限制。

在 C++ 中,数组是一种特殊的数据结构,它的大小和元素类型在编译时就必须确定。而 auto 关键字是用来进行类型推导的,它无法推导出数组的大小和元素类型。

所以,下面的代码是无法编译通过的:

auto arr[] = {1, 2, 3, 4, 5}; // 错误: 无法使用 auto 推导数组类型

正确的做法是使用显式的类型声明:

int arr[] = {1, 2, 3, 4, 5};

或者使用 std::array 容器,它可以与 auto 关键字配合使用:

std::array<int, 5> arr = {1, 2, 3, 4, 5};
auto arr2 = arr; // arr2 的类型被推导为 std::array<int, 5>
  1. 为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法
  2. auto在实际中最常见的优势用法就是跟以后会讲到的C++11提供的新式for循环,还有lambda表达式等进行配合使用。

🌠基于范围的for循环(C++11)

🌠范围for的语法

C++98中如果要遍历一个数组,可以按照以下方式进行:

int main()
{int array[] = { 1, 2, 3, 4, 5 };for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){array[i] *= 2;}for (int i = 0; i < sizeof(array) / sizeof(array[0]); ++i){cout << array[i] << " ";}cout << endl;return 0;
}

在这里插入图片描述对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围

int main()
{int array[] = { 1, 2, 3, 4, 5 };// C++11 范围for// 自动取数组array中,赋值给e// 自动++,自动判断结束for (auto& e : array){e *= 2;}for (auto e : array){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

注意:与普通循环类似,可以用continue来结束本次循环,也可以用break来跳出整个循环。

🌉 范围for的使用条件

  1. for循环迭代的范围必须是确定的
    对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。
    注意:以下代码就有问题,因为for的范围不确定
void TestFor(int array[])
{for(auto& e : array)cout<< e <<endl;
}

因为 array 在这里是一个指针,而不是一个数组。使用范围 for 循环遍历指针是不合适的,因为循环的范围是未知的。

  • . 对于数组而言,数组的大小在编译时就已经确定了,所以我们可以直接使用数组的首地址和末地址作为迭代范围:
void TestFor(int array[], size_t size)
{for (size_t i = 0; i < size; ++i)std::cout << array[i] << std::endl;
}
  • 对于类而言,如果想使用范围 for 循环,则需要提供 begin()end() 成员函数,返回指向容器首尾元素的迭代器:
class MyContainer {
public:int* begin() { return data; }int* end() { return data + size; }// ...
private:int data[10];size_t size;
};void TestFor(MyContainer& c)
{for (auto& e : c)std::cout << e << std::endl;
}
  1. 迭代的对象要实现++和==的操作。(关于迭代器这个问题,以后会讲,现在提一下,没办法讲清楚,现在大家了解一下就可以了)

🌉 指针空值nullptr(C++11)

🌠C++98中的指针空值

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:

void TestPtr()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}

NULL实际是一个宏,在传统的C语言头文件(stddef.h)中,可以看到如下代码:

#ifndef NULL//这是一个预处理指令,检查是否已经定义了 NULL 宏。如果没有定义,则执行下面的代码块。
#ifdef __cplusplus//这个预处理指令检查是否在 C++ 编译环境下。如果是 C++ 编译环境,则执行下面的代码块。
#define NULL   0//在 C++ 编译环境下,将 NULL 宏定义为 0。这是因为在 C++ 中,0 可以隐式转换为任何指针类型,所以将 NULL 定义为 0 是合理的
#else//如果不是 C++ 编译环境,则执行这个代码块。
#define NULL   ((void *)0)//在 C 语言编译环境下,将 NULL 宏定义为(void *)0。这里使用 (void *) 进行强制类型转换,将整数 0 转换为 void * 类型,这样可以表示一个空指针
#endif//结束 #ifdef __cplusplus 的条件编译块
#endif//结束 #ifndef NULL 的条件编译块

可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:

void f(int)
{cout << "f(int)" << endl;
}
void f(int*)
{cout << "f(int*)" << endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}

在这里插入图片描述
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。
C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0

注意:
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptrC++11作为新关键字引入的。
2. 在C++11中,sizeof(nullptr)sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr


🚩总结

请添加图片描述

相关文章:

我的C++奇迹之旅:内联函数和auto关键推导和指针空值

文章目录 &#x1f4dd;内联函数&#x1f320; 查看内联函数inline方式&#x1f309;内联函数特性&#x1f309;面试题 &#x1f320;auto关键字(C11)&#x1f320; auto的使用细则&#x1f309;auto不能推导的场景 &#x1f320;基于范围的for循环(C11)&#x1f320;范围for的…...

Redis主从集群-主从复制(通俗易懂)

为什么要搭建主从集群&#xff1f; 单节点Redis的并发能力是有上限的&#xff0c;要进一步提高Redis的并发能力&#xff0c;可以搭建主从集群&#xff0c;实现读写分离。一般都是一主多从&#xff0c;主节点负责写数据&#xff0c;从节点负责读数据&#xff0c;主节点写入数据…...

【C++算法竞赛 · 图论】图论基础

前言 图论基础 图的相关概念 图的定义 图的分类 按数量分类&#xff1a; 按边的类型分类&#xff1a; 边权 简单图 度 路径 连通 无向图 有向图 图的存储 方法概述 代码 复杂度 前言 图论&#xff08;Graph theory&#xff09;&#xff0c;是 OI 中的一样很大…...

Java解析实体类的属性和属性注释

前言 获取某个类的属性&#xff08;字段&#xff09;是我们经常都会碰到的&#xff0c;通常我们是通过反射来获取的。 但是有些特殊情况下&#xff0c;我们不仅要获取类的属性&#xff0c;还需要获取属性注释。这种情况下&#xff0c;我们只能通过注解去获取注释。可以自己定…...

机器学习KNN最邻近分类算法

文章目录 1、KNN算法简介2、KNN算法实现2.1、调用scikit-learn库中KNN算法 3、使用scikit-learn库生成数据集3.1、自定义函数划分数据集3.2、使用scikit-learn库划分数据集 4、使用scikit-learn库对鸢尾花数据集进行分类5、什么是超参数5.1、实现寻找超参数5.2、使用scikit-lea…...

分享一个Python爬虫入门实例(有源码,学习使用)

一、爬虫基础知识 Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍: 架构和组成:下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。解析器:用于解…...

算法:树形dp(树状dp)

文章目录 一、树形DP的概念1.基本概念2.解题步骤3.树形DP数据结构 二、典型例题1.LeetCode&#xff1a;337. 打家劫舍 III1.1、定义状态转移方程1.2、参考代码 2.ACWing&#xff1a;285. 没有上司的舞会1.1、定义状态转移方程1.2、拓扑排序参考代码1.3、dfs后序遍历参考代码 一…...

SQL语句学习+牛客基础39SQL

什么是SQL&#xff1f; SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;。 SQL 的范围包括数据插入、查询、更新和删除&#xff0c;数据库模式创建和修改&#xff0c;以及数据访问控制。 SQL语法 数据库表 一个…...

竞赛常考的知识点大总结(五)动态规划

DP问题的性质 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是指在解决动态规划问题时所依赖的一些基本特征和规律。动态规划是一种将复杂问题分解为更小子问题来解决的方法&#xff0c;它适用于具有重叠子问题和最优子结构性质的问题。动态规划问题通常…...

如何在 Mac 上恢复已删除的数据

如果您丢失了 Mac 上的数据&#xff0c;请不要绝望。恢复数据比您想象的要容易&#xff0c;并且有很多方法可以尝试。 在 Mac 上遭受数据丢失是每个人都认为永远不会发生在他们身上的事情之一......直到它发生。不过&#xff0c;请不要担心&#xff0c;因为您可以通过多种方法…...

Java笔试题总结

HashSet子类依靠()方法区分重复元素。 A toString(),equals() B clone(),equals() C hashCode(),equals() D getClass(),clone() 答案:C 解析: 先调用对象的hashcode方法将对象映射为数组下标,再通过equals来判断元素内容是否相同 以下程序执行的结果是&#xff1a; class X{…...

github本地仓库push到远程仓库

1.从远程仓库clone到本地 2.生成SSH秘钥&#xff0c;为push做准备 在Ubuntu命令行输入一下内容 [rootlocalhost ~]# ssh-keygen -t rsa < 建立密钥对&#xff0c;-t代表类型&#xff0c;有RSA和DSA两种 Generating public/private rsa key pair. Enter file in whi…...

Error: TF_DENORMALIZED_QUATERNION: Ignoring transform forchild_frame_id

问题 运行程序出现&#xff1a; Error: TF_DENORMALIZED_QUATERNION: Ignoring transform for child_frame_id “odom” from authority “unknown_publisher” because of an invalid quaternion in the transform (0.0 0.0 0.0 0.707) 主要是四元数没有归一化 Eigen::Quatern…...

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章&#xff1a;2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…...

Redis常用命令补充和持久化

一、redis 多数据库常用命令 1.1 多数据库间切换 1.2 多数据库间移动数据 1.3 清除数据库内数据 1.4 设置密码 1.4.1 使用config set requirepass yourpassword命令设置密码 1.4.2 使用config get requirepass命令查看密码 二、redis高可用 2.1 redis 持久化 2.1.1 持…...

【记录】海康相机(SDK)二次开发时的错误码

海康相机&#xff08;SDK&#xff09;二次开发时的错误码 在进行海康sdk二次开发的时候&#xff0c;经常碰到各种错误&#xff0c;遂结合官方文档和广大网友的一些经验&#xff0c;把这些错误码记录一下&#xff0c;方便查找。笔者使用的SDK版本是HCNetSDKV6.1.9.4。 错误类型…...

端盒日记Day02

JS 本本本本本地存储 localStorage 作用&#xff1a;可以将数据永久存储在本地&#xff08;用户电脑&#xff09;&#xff0c;除非手动删除&#xff0c;否则关闭页面也会存在 特性&#xff1a;a.可多窗口&#xff08;页面&#xff09;共享&#xff08;同一浏览器可以共享&a…...

考研高数(平面图形的面积,旋转体的体积)

1.平面图形的面积 纠正&#xff1a;参数方程求面积 2.旋转体的体积&#xff08;做题时&#xff0c;若以x为自变量不好计算&#xff0c;可以求反函数&#xff0c;y为自变量进行计算&#xff09;...

选择企业邮箱,扬帆迈向商务新纪元!

企业邮箱和个人邮箱不同&#xff0c;它的邮箱后缀是企业自己的域名。企业邮箱供应商一般都提供手机app、桌面端、web浏览器访问等邮箱使用途径。那么什么是企业邮箱&#xff1f;如何选择合适的企业邮箱&#xff1f;好用的企业邮箱应具备无缝迁移、协作、多邮箱管理等功能。 企…...

2024.3.25力扣每日一题——零钱兑换2

2024.3.25 题目来源我的题解方法一 动态规划 题目来源 力扣每日一题&#xff1b;题序&#xff1a;518 我的题解 方法一 动态规划 给定总金额 amount 和数组 coins&#xff0c;要求计算金额之和等于 amount 的硬币组合数。其中&#xff0c;coins的每个元素可以选取多次&#…...

包子凑数【蓝桥杯】/完全背包

包子凑数 完全背包 完全背包问题和01背包的区别就是&#xff0c;完全背包问题每一个物品能取无限次。 思路&#xff1a;当n个数的最大公约数不为1&#xff0c;即不互质时&#xff0c;有无限多个凑不出来的&#xff0c;即n个数都可以表示成kn&#xff0c;k为常数且不为1。当n个…...

口语 4.6

drop the gun :逃避 radically 极大程度地 vastly cognition&#xff1a;认知能力 flaw缺陷 flawless&#xff1a;没有缺陷 interface&#xff1a;接口&#xff0c;交流处 retain&#xff1a;保留 down the rabbit hole&#xff1a;进入未知领域了 wrap your head aro…...

使用Docker 部署jenkins 实现自动化部署

使用Docker部署jenkins实现自动化部署ruoyi-vue docker jenkinsJava jenkinsfilevue jenkinsfileDockerfile 部署脚本Java Dockerfilenginx Dockerfilenginx-dev.conf 使用docker部署Jenkins&#xff0c;项目: https://gitee.com/y_project/RuoYi-Vue 作为部署项目示范 docker…...

golang语言系列:Web框架+路由 之 Gin

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是golang语言学习系列&#xff0c;本篇对Gin框架的基本使用方法进行学习 1.Gin框架是什么 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架&#xff0c;运行速度非常快&#xff0c;如果你是性能和高效的追求者…...

春招百题--堆

一、堆的定义 二、堆&#xff08;优先队列&#xff09; 堆通常用于实现优先队列&#xff08;priority_queue&#xff09;&#xff0c;大顶堆相当于元素按从大到小的顺序出队的优先队列。从使用角度来看&#xff0c;我们可以将“优先队列”和“堆”看作等价的数据结构。 堆的…...

全志A40i android7.1 移植wifi驱动的一般流程

一&#xff0c;问题分析 一般情况下移植一款模组&#xff0c;会涉及到驱动&#xff0c;firmware, hal层&#xff0c;方案端的适配。 下面以RTL8723ds为例详细列出移植的通用步骤。 二&#xff0c;移植步骤 1. 移植Wi-Fi驱动 从RTL原厂或者已经支持的其他把内核版本中获取驱动…...

Qt——Qt绘图之QPainter的使用总结(使用paintEvent实现旋转图片效果)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …...

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…...

泰坦尼克号幸存者数据分析

泰坦尼克号幸存者数据分析 1、泰坦尼克号数据集2、数据集加载与概览3、泰坦尼克号幸存者数据分析4、哪些人可能成为幸存者&#xff1f; 1、泰坦尼克号数据集 泰坦尼克号的沉没是世界上最严重的海难事故之一&#xff0c;造成了大量的人员伤亡。这是一艘号称当时世界上最大的邮轮…...

网站的图片滚动怎么做的/重庆搜索引擎seo

这ListView真是麻烦&#xff0c;一个小小的FileBrowser废了将近2天。看来自己的功力还需要加强。 做FileBrowser中遇到几个ListView问题总结一下。 1、自定义样式 ListView其实和Asp.net里面的Repeater有点像&#xff0c;但是不同的是项的内容可以用一个layout文件来套用&#…...

建设党的群众路线网站 简报/美橙互联建站

前言 由于安装某个项目的执行文件&#xff0c;提示要卸载MySQL以便它自身MySQL安装&#xff0c;然后我禁用了MYSQL服务&#xff0c;再把这个文件夹删除后&#xff0c;发现还是提示请卸载MYSQL服务。 -------------------------------------------------------------------- …...

怎么利用公网做网站/论坛营销

http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/ LeakCanary 中文使用说明 10 May 2015 LeakCanary Android 和 Java 内存泄露检测。 “A small leak will sink a great ship.” - Benjamin Franklin 千里之堤&#xff0c; 毁于蚁穴。 -- 《韩非子喻老》 demo 一个非常…...

做网站图片多大/百度推广代理商利润

原标题&#xff1a;未来向计算机和人工智能方向发展&#xff0c;本科需要读什么专业想往计算机、人工智能发展&#xff0c;本科读统计学、信息与计算科学、计算机科学与技术都是很适合的专业。这三个专业实际上是交叉学科&#xff0c;都是以计算机技术为基础&#xff0c;只是侧…...

邯郸最穷的三个县/大连seo顾问

.NET 访问 Oracle 数据库相关 长期以来&#xff0c;我一直用的是 MS SQL Server / Access 数据库&#xff0c;通过 .NET 访问 MS 自家的东西几乎没碰到过什么麻烦。最近项目中要用 Oracle 作为数据库&#xff0c;学习研究了一些 .NET 访问 Oracle 的东西&#xff0c;发现问题倒…...

网站制作平台有哪些/福州seo博客

转自&#xff1a;http://blog.csdn.net/gengv/article/details/5714834...