查看: 115|回复: 0

1. C++笔记

[复制链接]

3

主题

5

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 2022-12-2 20:07:42 | 显示全部楼层 |阅读模式

  • constexpr
constexpr是c++11新添加的特征,目的是将运算尽量放在编译阶段,而不是运行阶段。这个从字面上也好理解,const是常量的意思,也就是后面不会发生改变,因此当然可以将计算的过程放在编译过程。constexpr可以修饰函数、结构体
eg:
static constexpr int CHECK_COUNT = 3;
static constexpr float IGNORE_THRESH = 0.1f;
2.alignas
alignas关键字用来设置内存中对齐方式,最小是8字节对齐,可以是16,32,64,128等.不用数据对齐方式test1占用16个字节,为什么?因为计算机会做字节对齐,一般都是对齐8位,如果不用alignas关键字,默认一般是8位对齐,但也有机器不是8位对齐。
test2占用16字节,对齐方式alignas(8)
test3占用16字节,对齐方式alignas(16)
test4占用32字节,对齐方式alignas(32)
计算方法就是对齐数的整数倍,比如32位对齐,实际数据大小不到32字节,但内存还是占用32字节。实际数据大于32字节小于64字节,内存占用64字节。
这种明确规定占用字节大小后,编写代码将更具有跨平台性
// eg
#include <iostream>
using namespace std;

struct  struct_Test1
{
    char c;
    int  i;
    double d;
};

struct alignas(8) struct_Test2
{
    char c;
    int  i;
    double d;
};

struct alignas(16) struct_Test3
{
    char c;
    int  i;
    double d;
};

struct alignas(32) struct_Test4
{
    char c;
    int  i;
    double d;
};

int main()
{
    struct_Test1 test1;
    struct_Test2 test2;
    struct_Test3 test3;
    struct_Test4 test4;

    cout<<"char size:"<<sizeof(char)<<endl;
    cout<<"int size:"<<sizeof(int)<<endl;
    cout<<"double size:"<<sizeof(double)<<endl;

    cout<<"test1 size:"<<sizeof(test1)<<endl;
    cout<<"test2 size:"<<sizeof(test2)<<endl;
    cout<<"test3 size:"<<sizeof(test3)<<endl;
    cout<<"test4 size:"<<sizeof(test4)<<endl;

    system("pause");

    return 0;
}


3.C++ class
4.noexcept 关键字的使用
在TensorRT8中,关于API的修改中非常的一点是所有 API 都添加了 noexcept关键字。该关键字告诉编译器,函数中不会发生异常,这有利于编译器对程序做更多的优化[1]。 首先,如果编译器知道函数不会抛出异常有助于简化调用该函数的代码;其次,编译器还会对函数本身进行某些特殊的优化操作,这些优化可能不适用于可能出错的代码。
但是编译器不会检查函数是否真的noexecpt,如果在运行时,noexecpt函数违反承诺,向外抛出了异常(如果函数内部捕捉了异常并完成处理,这种情况不算抛出异常),程序会调用std::terminate()[2]函数,该函数内部会调用std::abort()终止程序,以此确保不在运行时抛出异常的承诺。
5. .c_str()
char c[20];

string s="1234";
strcpy(c,s.c_str());
这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作。

语法: const char *c_str();
c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.,这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。
注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针
6. char*和char*&的区别
两者都是把地址传到函数中。都可以对传入的指针指向的值进行修改
一旦传入的指针修改后,char*不会影响到函数外的指针指向的值,char*&会影响到函数外指针指向的值,因为此指针已经不是传入的指针了
下面一段程序测试*&还能改变针的指向
#include<iostream>

struct point{
  //int x;
  //int y;
};

void changeNum1(point *&num_ptr){
  num_ptr = new point;
  std::cout<<"test1 changeNum1 -> new num_ptr'address"<<num_ptr<<std::endl;
  //num_ptr->x = 4;

}

void changeNum2(point *num_ptr){
  num_ptr = new point;
  std::cout<<"test2 changeNum2 -> new num_ptr` address"<<num_ptr<<std::endl;
// num_ptr->x = 4;
}

void test1(){
  point *num_ptr=new point;
  std::cout<<"test1 -> num_ptr` address"<<num_ptr<<std::endl;
  //num_ptr->x = 10;
  changeNum1(num_ptr);
  std::cout<<"test1 ->out of changeNum1: num_ptr` address"<<num_ptr<<std::endl;
  //std::cout<<num_ptr->x<<std::endl;
}

void test2(){
  point *num_ptr=new point;
  std::cout<<"test2 -> num_ptr` address"<<num_ptr<<std::endl;
// num_ptr->x=10;
  changeNum2(num_ptr);
  std::cout<<"test2 ->out of changeNum2: num_ptr` address"<<num_ptr<<std::endl;
  //std::cout<<num_ptr->x<<std::endl;
}

int main(int argc, char** argv){
  test1();
  std::cout<<"-----------------------------"<<std::endl;
  test2();
}结果:
test1 -> num_ptr` address0x1cdac20
test1 changeNum1 -> new num_ptr` address0x1cdb050
test1 ->out of changeNum1: num_ptr` address0x1cdb050
---------------------
test2 -> num_ptr` address0x1cdb070
test2 changeNum2 -> new num_ptr` address0x1cdb090
test2 ->out of changeNum2: num_ptr` address0x1cdb070
7. reinterpret_cast
8.conan和catkin:
conan remote remove conan-center

conan remote add conan-local https://artifactory.allride-ai.cn/artifactory/api/conan/conan-local

rm -rf build devel install && mkdir build && cd build && conan install .. && cd .. && catkin_make install -j
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表