创新的专业网站建设,西樵做网站,wordpress建手机版6,有做阿里网站的吗回顾 Shell脚本中的$虚函数虚函数和纯虚函数 git merge/rebasegit merge特点git rebase特点 Linux内核调试——coredump获取core dump 深度测试和模板测试2D游戏的制作思路C11特性 Shell脚本中的$
$0: 脚本自身的名称#xff1b; $1: 传入脚本的第一个参数#xff1b; $2… 回顾 Shell脚本中的$虚函数虚函数和纯虚函数 git merge/rebasegit merge特点git rebase特点 Linux内核调试——coredump获取core dump 深度测试和模板测试2D游戏的制作思路C11特性 Shell脚本中的$
$0: 脚本自身的名称 $1: 传入脚本的第一个参数 $2: 传入脚本的第二个参数 $: 传入脚本的所有参数 $*传入脚本的所有参数
$$: 脚本执行的进程id $#传入脚本的参数个数
$?: 上一条命令执行后的状态结果为0表示执行正常结果为1表示执行异常
虚函数
定义一个类中希望重载的成员函数当用一个基类指针或引用指向一个继承类对象的时候调用一个虚函数实际调用的是继承类的版本。 虚函数关键特点是动态联编可以在运行的时候判断指针指向的对象并自动调用想应的函数。
虚函数和纯虚函数
定义一个函数是虚函数不代表函数是不被实现的函数这是为了允许用基类的指针来调用子类的函数。 定义一个函数是纯虚函数代表函数没有被实现。 补充定义纯虚函数是为了实现一个接口起到一个规范的作用规范继承这个类的人必须实现这个函数。
纯虚函数是在基类中声明的虚函数它在基类中没有定义但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加0 纯虚函数是为了在有的情况下基类本身生成对象是不合理的。纯虚函数编译器会要求在派生类中重写实现多态性同时含有纯虚拟函数的类被称为抽象类不能生成对象。
git merge/rebase
git的版本管理把一个特性的开发合并到master分支有两种git merge/git rebase。两个作用相同都是将一个分支的提交合并到当前分支上但是原理不同。
git merge特点
使用 git checkout newbranch git merge master 则会在newbranch上新产生一个commit 只处理一次冲突。引入一次合并的历史记录合并后的所有commit会按照提交时间从旧到新排列。
git rebase特点
会合并之前的commit 历史去掉了merge commit。
Linux内核调试——coredump
分析core dump是Linux应用程序调试的一种有效方式core dump又称为“核心转储”是该进程实际使用的物理内存的“快照”。分析core dump文件可以获取应用程序崩溃时的现场信息如程序运行时的CPU寄存器值、堆栈指针、栈数据、函数调用栈等信息。
Core dump是Linux基于信号实现的。Linux中信号是一种异步事件处理机制每种信号都对应有默认的异常处理操作默认操作包括忽略该信号Ignore、暂停进程Stop、终止进程Terminate、终止并产生core dumpCore等。
在以下的情况会产生core dump
内存访问越界使用线程不安全函数例如不可重入函数多线程读写的数据未加锁保护临界区资源需要互斥访问非法指针空指针异常或非法地址访问堆栈溢出
获取core dump
使用ulimit -c 查看是否使用如果为0则默认不产生core dump可以使用ulimit -c unlimited使用可以通过如下路径查看core文件默认保存的地方 cat /proc/sys/kernel/core_pattern 默认保存在应用程序当前目录下如果应用程序中调用chdir()函数切换了当前工作目录则会保存在对应的工作目录可以指定core文件保存路径和文件名echo “/data/xxx/core_file” /proc/sys/kernel/core_patternulimit -c [size]指定core文件的大小默认不限制大小如果自定义的话size值必须大于4单位是block(1block 512bytes)可以使用 gdb test core命令辅助实现其中test是可执行文件而core是生成的core dump文件
深度测试和模板测试
深度测试的z值是0-1之间非常近的物体深度值设置接近0当物体接近远平面的时候深度值接近1。如果要决定是否绘制一个物体的表面则首先需要将表面对应的深度值和当前深度缓冲区中的值进行比较如果大于深度缓冲区的值则丢弃这部分。 当片段着色器处理完一个片段后模板测试就会开始执行也有可能会丢弃片段保留下来的片段接下来会进入深度测试。
2D游戏的制作思路
首先确认游戏机制其次定义游戏类包含所有的渲染和代码 作用管理游戏代码将窗口代码和游戏解耦着色器和纹理分别创建一个类。着色器需要接受2-3个字符串并生成一个编译后的着色器而纹理类需要接受一个字节数组宽高。下面需要实现一个单一实例的静态资源管理器封装所有已加载的资源以及相关的加载功能。再定义一个渲染类用来渲染球。再定义一个砖块类用来渲染砖块。
C11特性
C11扩大了用大括号括起的列表(初始化列表)的使用范围使其可用于所有的内置类型和用户自定义的类型使用初始化列表时可添加等号()也可不添加严格来说initializer_list在C里面是一个容器是原生支持的一个容器 对于在容器中插入一些值例如在vector中插入值时用到了push_back但是要插入多个值时需要用多个push_back这样也太繁琐了。所以C11中就可以对vector等容器一次性赋值就类似于数组的初始化比如vector int a {1,2,3,4,5}。为什么会这样这就跟initializer_list有关。 不仅vector支持用{ }初始化其他STL容器也支持就是因为它们都提供了支持initializer_list的构造函数。除此之外initializer_list也可以作为operator的参数这样就可以用大括号赋值。在C98中auto是一个存储类型的说明符表明变量是局部自动存储类型但是局部域中定义局部的变量默认就是自动存储类型所以auto就没什么价值了。C11中废弃auto原来的用法将其用于实现自动类型推导。这样要求必须进行显示初始化让编译器将定义对象的类型设置为初始化值的类型 //mapstring, string::iterator it dict.begin();auto it dict.begin();//等价于上面的写法大多数人都会认为decltype和auto是一样的但是对于以下场景只有decltype能做到例如decltype推导的类型可以作为容量里面的参数: auto it m.begin();//vectorauto it v;//错误vectordecltype(it) v;//正确关键字decltype将变量的类型声明为表达式指定的类型
C中NULL被定义成字面量0,0既能指针常量又能表示整形常量。所以出于清晰和安全的角度考虑C11中新增了nullptr用于表示空指针C11简化for循环可以直接用auto代替原有for循环内部循环限制无论左值引用还是右值引用都是给对象取别名。
左值是一个表示数据的表达式(如变量名或解引用的指针)我们可以获取它的地址可以对它赋值左值可以在赋值符号的左边也可以在赋值符号的右边。定义时const修饰符后的左值不能给他赋值但是可以取它的地址。左值引用就是给左值的引用给左值取别名。
右值也是一个表示数据的表达式如字面常量、表达式返回值传值返回函数的返回值(这个不能是左值引用返回)等等。右值可以出现在赋值符号的右边但是不能出现在赋值符号的左边右值不能取地址。右值引用就是对右值的引用给右值取别名
总的来说可以取地址的对象就是左值不取地址的对象就是右值
左值引用能否引用右值 不能直接引用但const左值引用可以引用右值 右值引用能否引用左值 不能直接引用但是右值引用可以引用move以后的左值
总结 左值引用 左值引用只能引用左值不能引用右值。 但是const左值引用既可引用左值也可引用右值
右值引用 右值引用只能右值不能引用左值。 但是右值引用可以move以后的左值。 补充 C11提供了完美转发来保证右值引用后的属性保持不变。 只需要Fun(t) 改为 Fun(std::forward(t)) 即可。
C11为了简化排序有了Lambda表达式
lambda表达式语法格式[capture-list] (parameters) mutable - return-type { statement } lambda表达式各部分说明 [capture-list] : 捕捉列表该列表总是出现在lambda函数的开始位置编译器根据[]来判断接下来的代码是否为lambda函数捕捉列表能够捕捉上下文中的变量供lambda函数使用 (parameters)参数列表。与普通函数的参数列表一致如果不需要参数传递则可以连同()一起省略 mutable默认情况下lambda函数总是一个const函数mutable可以取消其常量性。使用该修饰符时参数列表不可省略(即使参数为空) -returntype返回值类型。用追踪返回类型形式声明函数的返回值类型没有返回值时此部分可省略。返回值类型明确情况下也可省略由编译器对返回类型进行推导 {statement}函数体。在该函数体内除了可以使用其参数外还可以使用所有捕获到的变量
补充在lambda函数定义中参数列表和返回值类型都是可选部分而捕捉列表和函数体可以为空。因此C11中最简单的lambda函数为[]{}; 该lambda函数不能做任何事情
lambda表达式实际上可以理解为无名函数该函数无法直接调用如果想要直接调用可借助auto将其赋值给一个变量 捕获列表说明 捕捉列表描述了上下文中那些数据可以被lambda使用以及使用的方式是传值还是传引用
[var]表示值传递方式捕捉变量var []表示值传递方式捕获所有父作用域中的变量(成员函数中包括this) [var]表示引用传递捕捉变量var []表示引用传递捕捉所有父作用域中的变量(成员函数中包括this)
关键字default和delete C11可以更好的控制要使用的默认函数。可以用default指定拷贝构造生成。 如果能想要限制某些默认函数的生成在C98中是该函数设置成private并且只声明补丁已这样只要其他人想要调用就会报错。在C11中更简单只需在该函数声明加上delete即可该语法指示编译器不生成对应函数的默认版本称delete修饰的函数为删除函数C11 新增了两个移动构造函数和移动赋值运算符重载。C11新增了可变参数模板可以接受可变参数的函数模板和类模板C11中最重要的特性之一就是支持了线程使得C在并行编程时不需要依赖第三方库而且在原子操作中还引入了原子类的概念。要使用标准库中的线程