|
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<<&#34;char size:&#34;<<sizeof(char)<<endl;
cout<<&#34;int size:&#34;<<sizeof(int)<<endl;
cout<<&#34;double size:&#34;<<sizeof(double)<<endl;
cout<<&#34;test1 size:&#34;<<sizeof(test1)<<endl;
cout<<&#34;test2 size:&#34;<<sizeof(test2)<<endl;
cout<<&#34;test3 size:&#34;<<sizeof(test3)<<endl;
cout<<&#34;test4 size:&#34;<<sizeof(test4)<<endl;
system(&#34;pause&#34;);
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=&#34;1234&#34;;
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<<&#34;test1 changeNum1 -> new num_ptr&#39;address&#34;<<num_ptr<<std::endl;
//num_ptr->x = 4;
}
void changeNum2(point *num_ptr){
num_ptr = new point;
std::cout<<&#34;test2 changeNum2 -> new num_ptr` address&#34;<<num_ptr<<std::endl;
// num_ptr->x = 4;
}
void test1(){
point *num_ptr=new point;
std::cout<<&#34;test1 -> num_ptr` address&#34;<<num_ptr<<std::endl;
//num_ptr->x = 10;
changeNum1(num_ptr);
std::cout<<&#34;test1 ->out of changeNum1: num_ptr` address&#34;<<num_ptr<<std::endl;
//std::cout<<num_ptr->x<<std::endl;
}
void test2(){
point *num_ptr=new point;
std::cout<<&#34;test2 -> num_ptr` address&#34;<<num_ptr<<std::endl;
// num_ptr->x=10;
changeNum2(num_ptr);
std::cout<<&#34;test2 ->out of changeNum2: num_ptr` address&#34;<<num_ptr<<std::endl;
//std::cout<<num_ptr->x<<std::endl;
}
int main(int argc, char** argv){
test1();
std::cout<<&#34;-----------------------------&#34;<<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 |
|