C++PrimerPlus学习笔记——第9章内存模型和名称空间(最全最详细)

2023-05-16

:这一章都是理解记忆性的内容,因此笔者在某些知识点会将自己的理解话语写上,便于可读性和方便理解。

本章内容包括:

  1. 单独编译;
  2. 存储持续性、作用域和链接性;
  3. 定位(placement)new运算符;
  4. 名称空间

9.1 单独编译

1. 头文件中不要放入函数定义或变量声明

解释:如果头文件包含一个函数定义,然后属于同一程序的其他两个文件中都包含了该头文件,则同一程序中就包含了函数的两个定义,除非函数内联(inline),否则会出错。

2. 包含头文件的两种方式:< > vs " "

< >:如果文件名包含在<>中,则C++编译器将在存储标准头文件的主机系统的文件系统中查找;
" “:如果文件名包含在”“中,则编译器将首先查找当前工作目录或源代码目录(取决于编译器),如果在那没找到头文件,则将在标准位置查找。
:因此在包含自己的头文件时,应使用引号”"而不是尖括号<>。

3. #define #ifndef #endif

解释:ifndef - if not defined。这三个如何使用,简要说明如以下三部分。
//#define - 通常使用#define语句来创建符号常量
#define NUMBER 24
//但只要将define作用于名称其实就可以完成该定义了,因此:
#define STUDY_H_

//下面代码片段意味着当且仅当以前没有使用预处理器编译指令
//#define定义名称STUDY_H_时,才处理#ifndef 和#endif之间的语句:
#ifndef STUDY_H_
....
#endif

//综上可以像如下这样使用:
#ifndef STUDY_H_
#define STUDY_H_
(place include file contents here)
#endif

9.2 存储持续性、作用域和链接性

C++使用三种不同的方案(C++11中是四种)来存储数据,这些方案的区别在于数据保留在内存中的时间。

1. 四种存储方案

1.1 自动存储持续性
在函数定义中声明的变量(包括函数的参数),其存储持续性为自动的。它们在程序开始执行其所属的函数或代码块时被创建,在执行完成函数或代码块时,他们的内存就被释放。C++有两种存储持续性为自动的变量。
1.2 静态存储持续性
在函数定义外定义的变量使用关键字static定义的变量的存储持续性都为静态,他们在整个运行过程中都存在。C++有三种存储持续性为静态的变量。
1.3 线程存储持续性(C++11)
如果变量是使用关键字thread_local声明的,则其生命周期与所属的线程一样长。
1.4 动态存储持续性
用new运算符分配的内存将一直存在,直到使用delete运算符将其释放或程序结束为止。这种内存的存储持续性为动态,有时候被称为自由存储或堆。

2.作用域和链接性

作用域:名称在文件中的多大范围可见(作用范围-函数/代码块、全局)
链接性:如何在不同的单元中共享(文件间-外链接、文件中-内链接、只能当前函数/代码块使用-无链接性)
2.1 自动变量:作用域为局部,无链接性

int main()
{
	int num;
	int testNum = 24;
	{
		cout << "internal: " << endl;
		int testNum = 23;
		cout << num << " = num" << endl;//输出随机数 
		cout << testNum << " = testNum" << endl;//输出结果为23 = testNum,此时当前地址的testNum为代码块局部变量,隐藏了之前的定义,新定义可见,就定义不可见。
	}
	cout << testNum << " = testNum" << endl;//输出结果为24 = testNum,此时当前地址的testNum为全局变量。
}

如上代码所示:①自动变量的初始化是不确定的;②自动变量的数目随着函数的开始和结束而增减,因此程序在运行时对其进行管理,通常是留出一块内存,并将其视栈进行管理变量的增减(这样理解之后,就很好记住自动变量这类数据是存储在栈区当中),栈如下图所示。
在这里插入图片描述
2.2 静态持续变量
C++为静态存储持续性变量提供了3种链接性:外部链接性(文件间:可在其他文件中访问)、内部链接性(只能在当前文件中访问)、无链接性(只能在当前函数或代码块种访问)。
2.2.1 与自动变量的区别:区别于自动变量,由于静态变量的数目在程序运行期间时不变的,因此程序不需要使用特殊装置(如栈)来管理它们。编译器通过分配固定的内存块来存储所有的静态变量,这些变量在程序执行期间一直存在(下面例子会说明),如果没有显式地初始化静态变量,其默认值会被设置为0(这也区别于自动变量的“随机数”)。
如下图中展示了静态外部变量、内部变量还有自动变量:a-静态内部变量、b静态外部变量、c自动变量。
静态、外部、自动
自动、静态变量存储方式
2.2.2 静态变量的初始化:分为静态初始化(零初始化、常量表达式初始化)、动态初始化(变量在编译后初始化-个人理解为有如函数调用等类似的情况)。:常量表达式并非只能使用字面常量的算术表达式,还可以使用sizeof运算符等。

int x;//静态初始化:零初始化
int o = sizeof(int)//静态初始化:零初始化
int y = 5;//静态初始化:常量表达式初始化
long z = 13 * 13//静态初始化:常量表达式初始化
const double pi = 4.0 * atan(1.0);//动态初始化

2.2.3 静态持续性、外部链接性
首先了解C++的单定义规则,即在每个使用外部变量的文件中都必须声明它,但变量只能有一次定义。为了这种需求C++提供了两种变量声明:①定义声明(简称定义),它能给变量分配存储空间;②引用声明(简称声明),它不给变量分配存储空间,因为他引用的是已有的变量,其使用关键字extern。
关键字extern的使用:如果在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(单定义规则),但在使用该变量的其他文件中,必须使用extern声明它。

//file1.cpp
int num;
//int num = 16; 如果file1中num初始化了某个值,那么在file2中就不可以再num = 24;
//file2.cpp
#include "file1.cpp"
extern int num = 24;
int main()
{
	cout << num << " = num " << endl;//输出24,如果file2中extern int num,此时输出默认值0.
}

外部变量与局部变量:覆盖问题、如何选择
由如下代码块可以看出,外部变量在函数中会由局部变量所覆盖。

//file1.cpp
int num = 24;
//file2.cpp
extern int num;
void globalNum(int it);
void localNum();

using std::cout;

void globalNum(int it)
{
	extern int num;
	num += it;//此时num为外部(相对于局部称为全局)变量
	cout << num << " = num" << endl;
	cout << &num << " = address of num" << endl;	
}
void localNum()
{
	int num = 23;
	num += it;//此时num为局部变量
	cout << num << " = num" << endl;
	cout << &num << " = address of num" << endl;	
}

那么既然能使用全局、局部,该怎么选择呢?答:通常情况下,应使用局部变量。这是由于:全局变量是所有的函数都能访问,这样造成了程序的不可靠性。程序越能避免对数据的不必要访问,就越能保持数据的完整性。
2.2.4 静态持续性、内部链接性
将static限定符用于作用域为整个文件的变量时,该变量的链接性将为内部的。
如下代码块所示,首先它违反了单定义规则,file2中的定义试图创建一个外部变量,因此程序将包含两个error的定义,错误。

//file1.cpp
int error = 24;
//file2.cpp
#include "file1.cpp"
int error = 23;
//extern int error;
//这样才是正确的,在多文件的程序中,可以且只能在一个文件中定义一个外部变量,其他使用变量的文件只能使用关键字extern声明它。
void errorPrint()
{
	cout << error << endl;//failed
}

再如下代码块所示,file2定义了一个静态外部变量,虽然其名称与file1中声明的常规外部变量一样,但是这种情况下静态变量将隐藏常规外部变量,不会出错。(两种链接性)

//file1.cpp
int right = 24;
//file2.cpp
#include "file1.cpp"
static int right = 23;
void rightPrint()
{
	cout << right << endl;//uses right defined in file1 
}

2.2.5 静态持续性、无链接性
如下代码块所示,在代码块中使用static int total时,将导致局部变量的存储持续性为静态的,这意味着该变量只在当前代码块中可用,并且不处于活动状态时仍然存在,因此其与count的结果不一样。
如果初始化了静态局部变量,则程序只在启动时进行了一次初始化,以后再调用函数时,将不会像自动变量那样再次被初始化。

void test()
{
	using namespace std;
	static int total = 0;
	int count = 0;
	cout << total++ << " = total" << endl;
	cout << count++ << " = count" << endl;
}
int main()
{
	for(int i = 0; i < 2; ++i)
		test();
}
//输出结果如下:
0 = total
0 = count
1 = total
0 = count

2.2.6 说明符与限定符
auto(在C++11中不再是说明符):以前的auto用于显示地指出变量为自动存储,在C++11中使用auto关键字可以要求编译器对变量的类型进行自动推导
register:
static:关键字static被用于整个文件时表示其变量是内部链接性;被用于局部声明中时,表示局部变量的存储持续性为静态的。
extern:关键字extern声明是引用声明,即声明引用在其他地方定义的变量。
thread_local(C++11新增):关键字thread_local指出变量的持续性与其所属线程的持续性相同,其变量之于线程犹如常规静态变量之于整个程序。
mutable:关键字mutable,例如在结构体中可以让const限定符后的结构体的mutable成员完成修改。
在C++中,const限定符对默认存储类型稍有影响,在默认情况下,全局变量的链接性为外部,但const全局变量的链接性为内部。所以如果程序员希望某个常量的链接性为外部,则可以使用extern来覆盖默认的内部链接性:

extern const int state = 50

2.2.7 函数和链接性
C++不允许在一个函数中定义另一个函数,因此所有函数的持续性都自动为静态的,即在程序执行期间一直存在。**在默认的情况下,函数的链接性为外部,即可以在文件间分享,使用关键字static可以将函数的链接性设置成内部的,即只能在一个文件中使用。**此时,必须同时在原型和函数定义中使用extern。和变量一样,也存在静态函数覆盖外部定义的情况。

static int private(int num);
....
static int private(int num)
{
	....
}

实际上,可以在函数原型中使用关键字extern指出函数是另一个文件中定义的,但这是可选的,这需要文件必须作为程序的组成部分被编译,或链接程序搜索的库文件。
单定义规则也适用于非内联函数,每个非内联函数程序只能包含一个定义。
针对内联函数:允许程序员将内联函数的定义放在头文件中,这样包含了头文件的每个函数都有其定义,C++要求同一个函数的所有内敛定义必须相同。
2.2.8 存储方案和动态分配
通常,编译器使用三块独立的内存:用于静态变量(可能再细分)、用于自动变量、用于动态存储
动态内存是由运算符new、delete控制,而不是由作用域和链接性规则控制。因此,可以在一个函数重分配动态内存,而在另一个函数中将其释放。
:通常程序结束时,由new分配的内存都将被释放,但是情况并不总是这样,在某些情况下,请求大型内存块将导致代码块在程序结束时不会被自动释放。因为最佳做法是使用delete手动释放
①下面介绍使用new运算符的初始化:

//内置的标量类型(如int/double...)
int *pi = new int(6);// *pi set to 6
double *pd = new double(99.99);//*pd set to 99.99
//常规结构和数组,需要用大括号的列表初始化(C++11)
struct where {double x; double y; double z};
where *one = new where {1.1, 1.2, 1.3};
int *ar = new int[4] {1, 2, 3, 4};
//在C++11中还可以使用列表初始化用于单值常量
int *pi = new int{6};
double *pd = new double{99.99};

//其他形式
int *pi = new(sizeof(int));
int *pi = new(40 * sizeof(int));// int *pi = new int[40];

②new失败:new可能找不到请求的内存量,现在这将引发异常std::bad_alloc。
③定位new运算符
new负责在堆(heap)中找到一个能够满足要求的内存块,new运算符还有个变体可以指定要使用的位置,被称为定位(placement)new运算符。

#include <new>
char buffer[50];//静态内存,位于delete管辖范围外
int main()
{
	int offset = 1;
	int *p = new (buffer) int[20];
	//也可以加上偏移量
	//int *p = new (buffer + 1*sizeof(int)) int[20];
	...
	delete[] p//don't work
}

:delete只能用于常规new运算发分配的堆内存,而对定位new运算符,不属于其管辖内存范围。

9.3 名称空间

在这里插入图片描述
在这里插入图片描述
下面举个例子说明下名称空间简单的基本使用

//file1.cpp
namespace kobe
{
	int number;
	std::string last_name;
	struct lakers
	{
		std::string fname;
		std::string lname;
	};
	void restInPeace();
}
namespace pau
{
	using namespace kobe;
	struct LAKERS
	{
		lakers fname;
		double amount;
	}
	...
} 
//file2.cpp
#include "file1.cpp"
namespace kobe
{
	using std::cout;
	void restInPeace()
	{
		cout << "RIP, Kobe Bean Bryant " << endl;
	}
}

1. using编译指令和using声明

//using编译指令 
using namespce std
//using声明 
int x;
std::cin >> x;
std::cout << x << std::endl;

//using声明 
using std::cin;
using std::cout;
using std::endl;

cin >> x;
cout << x << endl;


Ⅰ. 不要在头文件中使用using编译指令。首先,这样做掩盖了哪些名称可用;另外包含头文件的顺序可能影响程序的行为。如果非得要使用编译指令using,应该放其在所有预处理器编译指令#include之后。
Ⅱ. 导入名称时,首选使用作用域解析运算符或者using声明的方法。
Ⅲ. 对于using声明,首选将作用域设置为局部而不是全局。

9.4 内容归纳

  1. 程序多文件便写:头文件、源代码文件、main和其他使用这些自定义类型和自定义函数的函数文件;
  2. 自动变量、静态变量、动态变量的作用域与链接性。
  3. 注意extern、static、const;
  4. new delete(普通new、定位new运算符);
  5. 名称空间为了减少名称冲突,控制名称的作用域:作用域解析运算符、using声明、using编译指令。

感谢大家的浏览,如有不正确或者需要添加的地方,欢迎评论区或者私信交流。这些都是笔者一点一滴的心血,来个点赞评论收藏吧!哈哈哈如需转载及其他目的,望先告知笔者。
最后,放一张我本科时得到国奖写的个人事迹的其中一块的截图,来标记下我的第一篇博文。也希望你我在学习过程中、成长过程中都永怀一颗曼巴的心♥
*****最后引用*****

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++PrimerPlus学习笔记——第9章内存模型和名称空间(最全最详细) 的相关文章

  • git合并解决

    远程分支被修改了 xff0c 本地分支落后修改 xff0c 合并 方法一 xff1a 在你自己的分支上 xff0c 如果有本地修改先 git stash git pull git merge origin master 如果本地分支是mas
  • TCP Keepalive

    TCP Keepalive的起源 TCP协议中有长连接和短连接之分 短连接环境下 xff0c 数据交互完毕后 xff0c 主动释放连接 xff1b 长连接的环境下 xff0c 进行一次数据交互后 xff0c 很长一段时间内无数据交互时 xf
  • 【转载】深入浅出讲解FOC算法与SVPWM技术——自制FOC驱动器

    原文链接 xff1a https zhuanlan zhihu com p 147659820 参考文献 xff1a https zhuanlan zhihu com p 364247816 https www zhihu com ques
  • Linux 基本用户和组命令

    Linux 基本用户和组命令 1有关用户的命令 1 新增用户 Useradd 43 用户名 2 查看用户是否存在 id 43 用户名 3 删除用户 sudo userdel 用户名 只会删除用户本身 sudo userdel r 43 用户
  • Linux文件及权限

    Linux文件及权限 1 xff0e 查看文件权限 1 ls l 命令 ll 命令 显示详细信息 例 xff1a root 64 localhost Desktop ll total 178752 rwxr xr x 1 root root
  • 各种排序算法和应用场景

    简介 插入排序 插入排序是一种较为简单的排序算法 xff0c 它的基本思想是通过构建有序序列 xff0c 对于未排序数据 xff0c 在已排序序列中从后向前扫描 xff0c 找到相应位置并插入 形象的可以理解为打扑克抓拍的过程 xff0c
  • C/C++(3)C++调用C语言的函数和头文件

    C 43 43 语言支持函数重载 xff0c C语言不支持函数重载 函数被C 43 43 编译后在库中的名字与C语言的不同 xff0c C xff0b xff0b 和C是两种完全不同的编译链接处理方式 xff0c 如果直接在C xff0b
  • 一文了解IMU原理、误差模型、标定、惯性传感器选型以及IMU产品调研(含IMU、AHRS、VRU和INS区别)

    在此记录一下测试IMU过程中的其它文章 xff0c 便于以后查看 xff1a IMU的误差标定以及姿态解算ROS下通过USB端口读取摄像头数据 包括笔记本自带摄像头 激光 摄像头 IMU等传感器数据同步方法 message filters
  • windows安装Ubuntu子系统以及图形化界面记录

    文章目录 1 windows环境设置2 开始安装3 ubuntu使用3 1 启动和退出 Linux 子系统3 2 安装位置3 3 更换源 4 安装图形化界面4 1 安装VcXsrv4 2 安装桌面环境 xff08 1 xff09 方法1 x
  • STM32 DMA正常模式等待传输完成和开始下一次传输

    选择DMA的正常模式 xff0c 即DMA只传输一次 如果当传输完一次后 xff0c 还想再传输一次 xff0c 就需要重启DMA xff1a DMA Cmd DMA1 Channel6 DISABLE 重新设置源地址 重新设置目的地址 重
  • 增量式编码器和绝对式编码器,ABI信号和UVW信号、编码器PWM信号

    一 编码器的分类 根据检测原理 xff0c 编码器可分为光学式 磁式 感应式和电容式 xff0c 根据其刻度方法及信号输出形式 xff0c 可分为增量式 绝对式以及混合式三种 1 增量式编码器 增量式编码器是直接利用光电转换原理输出三组方波
  • 路由器接口管理 控制端口 辅助端口 物理端口 逻辑端口 局域网

    路由器接口管理 路由器的接口相对于交换机来说最大的特点就是接口类型和配置更为复杂 xff0c 一般吧路由器上的接口分为三大类 xff1a 1 局域网的LAN接口 xff0c 2 用于广域网接入 互联的WAN接口 xff0c 3 应用于LAN
  • C++各大有名库的介绍

    C 43 43 各大有名库的介绍 在C 43 43 中 xff0c 库的地位是非常高的 C 43 43 之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论 现实中 xff0c C 43 43 的
  • 树莓派搭建nas服务器的详细过程

    前奏 默认的登录帐号为 pi xff0c 密码是 raspberry 开启 ssh 在根目录 xff0c 新建一个名为 ssh 的空白文件就行了 然后 xff0c 重启就可以ssh访问了 命令行下配置 xff1a sudo raspi co
  • buffer overflow detected错误

    最近在写并行程序的时候遇到这个问题 在上网查询之后发现好多是由于sprintf的缓冲区不够造成的 对比自己程序发现一个很低级的错误 char sc 61 new char 100 sprintf sc 34 d 34 rank string
  • 聊一聊关于ROS开发常用的调试工具(rostopic,rosnode等等)

    ROS常用的调试工具有rosnode xff0c rostopic 1 rosnode 参数用法作用listrosnode list查看当前运行了哪些节点inforosnode info node name查看该节点发布 接受哪些话题以及服
  • 关于SLAM-Hector建图方法的一些基础点

    hector建图算法 1 简介 hector slam不需要里程计数据 xff0c 使用高斯牛顿方法 xff0c 直接使用激光雷达数据估算里程计信息 所以 xff0c 只需要激光雷达数据 xff0c 即可完成建图 2 优缺点 优点 xff1
  • 查全率(Recall)、查准率(Precision)以及综合评价指标(F1-Measure )

    xfeff xfeff 原文转载于 xff1a http www cnblogs com bluepoint2009 archive 2012 09 18 precision recall f measures html 在信息检索和自然语
  • 什么是码,主码,主属性,非主属性

    xfeff xfeff 码 xff1a 代表数目的符号 主码 我们在建立数据库的时候 xff0c 需要为每张表指定一个主码 xff0c 主码也叫主键 所谓主码就是在实体集中区分不同实体的候选码 一个实体集中只能有一个主码 xff0c 但可以
  • 整数二进制补码的数学原理(two's complement)

    转载自 整数二进制补码的数学原理 two 39 s complement 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61

随机推荐

  • IP,子网掩码,默认网关和DNS都是什么,有什么用

    彻底明白IP 地址 完整版 xff08 含CIDR 讲解 xff09 不管是学习网络还是上网 xff0c IP 地址都是出现频率非常高的词 Windows 系统中设置IP 地址的界面如图1 所示 xff0c 图中出现了IP 地址 子网掩码
  • 催经的方法【吐血整理】

    xfeff xfeff 催经的方法 吐血整理 1 生姜红糖茶 2 益母草颗粒 xff0c 中成药 xff0c 很有效 3 乌鸡白凤丸 43 逍遥丸 艾灸 至少对我这个寒性体质导致的姨妈不来很有效 一周不到姨妈必来 4 把药膏贴在肚脐眼 气血
  • 向量的模和范数

    xfeff xfeff 向量的模 向量 的 大小 或长度 xff09 叫做向量的模 xff0c 记作 平面向量 61 x y xff0c 模长是 xff1a 空间向量 61 x y z xff0c 模长是 xff1a 对于向量 属于 n 维
  • 基于LMS的正弦信号去噪

    coding utf 8 34 34 34 Created on Thu May 30 21 17 42 2013 64 author Timchen525 34 34 34 import numpy as np import matplo
  • 查找本机 CD-Key 的方法

    背景 由于笔记本的硬盘快满了 xff0c 打算换个新硬盘并重装 windows系统还希望继续使用原来的正版CD Key 方法 1 powershell 搜索 powershell xff0c 以管理员身份运行 2 查找ProductKey
  • libSVM简介及核函数模型选择

    xfeff xfeff 转自 xff1a libSVM简介及核函数模型选择 1 libSVM简介 训练模型的结构体 struct svm problem 储存参加计算的所有样本 int l 记录样本总数 double y 指向样本类别的组数
  • opencv学习系列教程之一 整体框架

    现在就业人数最多的是计算机专业 xff0c 而这个专业的很多人都是做深度学习 xff0c 或者行为识别这块 xff0c 这讲主要介绍一下很常用的一个工具 opencv 很多人说 xff0c 这是一个程序 xff0c 有些人这是很多算法 xf
  • C/C++ Socket UDP 广播消息的发送与接收

    C C 43 43 Socket UDP 广播消息的发送与接收 局域网内全网段广播消息的IP地址为 xff1a 255 255 255 255 xff0c 向该IP地址发送广播消息 xff0c 局域网下的任何网段的客户机都能收到广播 对于发
  • A* 寻路算法

    A 寻路算法 原文地址 xff1a http www gamedev net reference articles article2003 asp 概述 虽然掌握了 A 算法的人认为它容易 xff0c 但是对于初学者来说 xff0c A 算
  • 防止头文件被重复引用

    一 下划线 属于编程风格的内容 xff0c 对程序没有影响 不用下划线也可以 xff0c 用几个下划线也由个人习惯 二 其实质是一个宏名 由此我们可以防止发生重复定义或声明 假设你的头文件名为head h xff0c 根据习惯 xff0c
  • UDP通信绑定指定IP

    由于测试需要 xff0c 自己用vconfig在自己的虚拟机里添加了很多ip xff0c 实现不同Ip间的通信 UDP客户端向服务器发送报文时 xff0c 绑定会有最近IP原则 xff0c 比如 xff0c 你机器上有如下几个IP xff1
  • C++中两个同名头文件的引用顺序

    明人不说暗话 xff0c 直接上代码 xff1a 这里有两个路径下的同名head h头文件 includea head h define A 100 int funA return A includeb head h define A 20
  • 用户态协议栈学习,DKDK基本用法介绍

    网络数据流 xff0c 先了解一下用户态协议栈在什么位置 这里以DPDK为例 xff1a xff08 目的是为了获得原始的网络数据 xff0c 除了DPDK xff0c socket raw xff0c netmap也能获取获取以太网数据
  • 多旋翼基本组成

    一 总体认识 多旋翼三大系统 机身 动力系统 控制系统 xff08 导航模块 控制模块 决策模块 xff09 二 机身主体 xff1a 机架 xff08 1 xff09 作用 多旋翼的承载平台 xff0c 所有设备都是用机架承载 因此 xf
  • 数据处理(伪)代码:卡尔曼滤波 vs. 卡尔曼平滑

    步骤一 导入csv或txt格式的试验数据 最简洁也是据说读取速度最快的方法是 xff1a pPath span class token operator 61 span span class token string 39 C data o
  • 四旋翼初次组装

    一 四旋翼配置清单 初次尝试组装四旋翼 xff0c 在淘宝上买相关配件 xff0c 进行组装 初次组装 xff0c 比较乱 二 装机步骤 1 xff1a 机臂与上层中心板安装 xff0c 2 5mm螺丝 2 xff1a 香蕉头灌锡 xff0
  • 四轴飞行前检查及解锁

    一 飞行前的检查及注意事项 1 飞控的校正遥控器中 xff0c 每个通道与MP中显示的通道校正条是否一致 xff0c 遥控器控制杆摇动的方向是否正确 2 飞控的校正是否已经完成了全部校正 3 电机的的安装序号是否与飞控OUTPUT的通道数一
  • pixhawk之NSH调试

    一 ardupilot固件 windows环境 前期准备 1 xff1a pix烧录程序 xff0c Arducopter或者library中的example都可以实现 2 xff1a 拔掉SD卡 xff08 脚本中提到的没有SD卡进入ns
  • 目标检测(yolov3)实现---darknet的C语言版本

    环境安装 ubuntu opencv cuda cudnn gt920m 参考 https blog csdn net qq 36362060 article details 80739573 darknet github地址 https
  • C++PrimerPlus学习笔记——第9章内存模型和名称空间(最全最详细)

    注 xff1a 这一章都是理解记忆性的内容 xff0c 因此笔者在某些知识点会将自己的理解话语写上 xff0c 便于可读性和方便理解 本章内容包括 xff1a 单独编译 xff1b 存储持续性 作用域和链接性 xff1b 定位 xff08