文章目录
1. C++软件开发 - 常见代码问题及处理方法
1.1 C++ 未使用的函数形参
std::string ReadFile(const std::string& file_path, std::string &error_info){
(void)file_path;
(void)error_info;
return "";
}
1.2 查看硬件状态
- 安装jtop: 察看是否成功安装显卡驱动(原因看这),一个能够检测硬件状态的软件,这里推荐jetson产品适配的jtop。具体安装方法为:
sudo apt-get install python-pip
sudo -H pip install jetson-stats
安装完之后,重新启动机器后,就可以使用了
sudo reboot
jtop
- 查看GPU使用情况
tegrastats
NVIDIA Triton推理服务器是NVIDIA发布的一款开源软件,可简化深度学习模型在生产环境中的部署。
推理服务器可在单个 GPU 上同时运行多个模型,以更大限度地提高利用率,并可与 Kubernetes 集成以用于编排、指标和自动扩展。
Nvidia Triton使用教程:从青铜到王者
2. C++ 基础知识
2.1 基本数据类型
- 类型大小
数据类型 | 类型大小 (字节) | 数据范围 |
---|---|---|
char | 1 | |
float | 4 | |
long | 4 | |
int | 4 | |
unsigned int | 4 | |
short int | 2 | |
long int | 4 | |
double | 8 | |
long double | 16 | |
long long | 8 |
std::cout << "char " << sizeof (char) << std::endl;
std::cout << "float " << sizeof (float) << std::endl;
std::cout << "long " << sizeof (long) << std::endl;
std::cout << "int " << sizeof (int) << std::endl;
std::cout << "unsigned int " << sizeof (unsigned int) << std::endl;
std::cout << "short int " << sizeof (short int) << std::endl;
std::cout << "long int " << sizeof (long int) << std::endl;
std::cout << "double " << sizeof (double) << std::endl;
std::cout << "long double" << sizeof (long double) << std::endl;
std::cout << "long long " << sizeof (long long) << std::endl;
printf
char 1
float 4
long 4
int 4
unsigned int 4
short int 2
long int 4
double 8
long double16
long long 8
2.2 容器
- vector
vector 的初始化方式
std::vector<int> vec; // size为0,表明容器中没有元素,没有分配内存空间
std::vector<int> vec(6); // size为6,每个元素进行缺省的值初始化,对于int,也就是被赋值为0
std::vector<int> vec(6,3);// size为6,每个元素值初始化为3
std::vector<int> vec = {1,2,3,4,5,6}; //初始化为列表中元素的拷贝,类型必须相同则直接拷贝,其他类型会进行类型转换。
std::vector<int> vec{1,2,3,4,5,6}; //同上
std::vector<int> vec(vec_2); //拷贝初始化,将vec_2元素全部拷贝到vec
std::vector<int> vec = vec_2; //同上
//迭代器
std::vector<int> list3(list.begin() + 2, list.end() - 1); //拷贝初始化
- list
- map
2.3 模板
2.3.1 模板函数
class TemplateTest {
TemplateTest() = delete;
public:
template<typename T> static std::string Test1(const T& obj) {
return impl::TemplateTest::Test1(obj);
}
};
模板函数必须在 .h 中实现
- 由于模板不是函数,只是一些C++编译器指令,说明了如何生成类和成员函数定义,无法单独编译成obj文件,因此不能将模板成员函数放在独立的实现文件中。模板必须与特定的模板实例化请求一起使用,最简单的方法是将所有的模板信息放在一个头文件中,并在要使用这些模板的文件中包含该头文件。
2.3.2 模板类
C++ 关键字
assert
assert,中文翻译为断言,注意是一个宏定义,不是函数。
c++中,要使用assert,可以将cassert头文件include进来,而cassert最终是引用的assert.h。
assert的作用: 如果它里面的条件返回错误,代码会终止运行,并输出源文件,错误的代码、行号
const 与 static
1. const关键字
- const 修饰变量
const int a = 0; //告诉编译器a是一个常量,其值不可修改
- const修饰指针-对象
const int *p = 0;// 左定值,指向内容不变
- const修饰指针-地址
int * const p = 0;// 右定值,指针p指向的地址不变
- const 修饰函数-形参
void f(const Test& s);//采用const + 引用的方式进行自定义参数传递,对于Tset类而言不调用构造函数,用的是拷贝构造函数。
- const 修饰函数-返回值
int f() const; //返回值为const类型。
2. static关键字
3. const 与 static 对比
-
const 不与static同用
static修饰静态成员函数,不含this指针,不能实例化
const成员函数必须具体到某一实例化
-
常成员函数和static成员函数都没有this指针
-
参考文献
- 菜鸟教程——C++ const 关键字小结
- C++primer第五版
3 C++ 常用的库函数
3.1 std::cout输出不同颜色
C++设置输出颜色
#include <iostream>
std::cout << "\033[32m 字体颜色为绿色 \033[0m" << std::endl;
……
std::cout << "\033[32m 字体颜色为绿色 " << std::endl;
/* 此段字体颜色均为绿色 */
std::cout << "\033[0m";
// "\033[" 为起始字段
// 33m为绿色字体
// 0m关闭所有属性
ANSI控制码 | 描述 | ANSI控制码 | 描述 | ANSI控制码 | 描述 | ||
---|---|---|---|---|---|---|---|
\033[0m | 关闭所有属性 | \033[1m | 高亮 | \033[2m | 亮度减半 | ||
\033[3m | 斜体 | \033[4m | 下划线 | \033[5m | 闪烁 | ||
\033[7m | 反显 | \033[8m | 消隐 | \033[9m | 中间一道横线 | ||
10-19 | 字体 | 21-29 | 基本与1-9相反 | ||||
30-37 | 设置前景色 | 40-47 | 设置背景色 | ||||
\033[30m | 黑色 | \033[31m | 红色 | \033[32m | 绿色 | ||
\033[33m | 黄色 | \033[34m | 蓝色 | \033[35m | 紫色 | ||
\033[36m | 深绿色 | \033[37m | 白色 | ||||
\033[38m | 打开下划线,设置默认前景色 | ||||||
\033[39m | 关闭下划线,设置默认前景色 | ||||||
\033[40m | 黑色背景 | \033[41m | 红色背景 | \033[42m | 绿色背景 | ||
\033[43m | 黄色背景 | \033[44m | 蓝色背景 | \033[45m | 品红背景 | ||
\033[46m | 孔雀蓝背景 | \033[47m | 白色背景 | ||||
\033[nA | 光标上移n行 | \033[nB | 光标下移n行 | ||||
\033[nC | 光标右移n行 | \033[nD | 光标左移n行 |
3.2 math库函数
3.2.1 数值取整取零取余
向上取整/向上取整
#include<math.h>
//ceil 向上取整
ceil(-1.3)=-1; ceil(1.3)=2;
//floor 向下取整
loor(-1.3)=-2; floor(1.3)=1;
//round 四舍五入到最近的整数
round(-1.3)=-1;round(-1.52)=-2;round(1.3)=1;round(1.52)=2
//fix 朝零取整
fix(-1.3)=-1; fix(1.3)=1;
//整除
7/2=3; -7/2=-3
//取余
7%2=1; -7%2=-1
//绝对值
abs(-24.5)=24.5 ; //int、double、float绝对值
fabs(-12.3)=12.3;//double、float的绝对值
//次幂
pow(4,3)=64;
//平方根
sqrt(4)=2 ;
4. C++ 提高篇
4.1 lambda表达式 {}
lambda函数又称匿名函数,有函数体,没有函数名。函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存范围内的状态。
基本形式如下:
[capture](parameters)->return-type {body}
[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分,最后就是函数体部分了。lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。
常用方法如下:
- [] 不截取任何变量
- [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
- [=]截取外部作用域中所有变量,并拷贝一份在函数体中使用
- [=, &foo]截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
- [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
- [x, &y] x按值传递,y按引用传递
- [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
4.2 按位运算
memcpy
reserve是设置了capacity的值,比如reserve(20),表示该容器最大容量为20,但此时容器内还没有任何对象,也不能通过下标访问。
resize既分配了空间,也创建了对象,可以通过下标访问