C++ 软件开发工程师随笔记录

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 基本数据类型

  1. 类型大小
数据类型类型大小 (字节)数据范围
char1
float4
long4
int4
unsigned int4
short int2
long int4
double8
long double16
long long8
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 容器

  1. 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); //拷贝初始化
  1. list
  2. 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指针


  • 参考文献

  1. 菜鸟教程——C++ const 关键字小结
  2. 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既分配了空间,也创建了对象,可以通过下标访问

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老鼠不吃猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值