C++初窥

Achievement provides the only real pleasure in life.

有所成就是人生唯一的真正的樂趣。

之前做了几年的FPGA,期间也开发过STM32程序,仅限于根据需求点亮LED单色屏。可是随着工程的需求,以及越来越多的发现,虽然FPGA在做硬件(数据)加速尤其是算法层面数据预处理或者中间数据的处理有着非常天然的优势,也得益于FPGA特性---并行性以及一些高速接口,eg:DDR4/serDes/100G Ethernet...。但是在面对一些更加复杂算法时,实现难度也是几何级数的增加。并且现在xilinx退出了高层次综合软件HLS以及相应的内核,之前的microblaze和7series的ZYNQ系列,无疑给算法的implement带来更加的灵活性,所以决定重新再把本科以及研究生学习过的C/C++重新学一下,有点朝花夕拾的味道~~~

目前阅读的教材是《C++面向对象程序设计》---清华大学谭浩强老师的(还记得当时大一学的就是他绿皮书的C语言,一晃10年过去了)。

--------------------------------以下是自我理解,欢迎讨论---------------------------------------

初步阅读了第一章和第二章的内容,给我最大的感觉就是 --- 如果做过底层实现,因为FPGA所有打交道的都是二进制,不存在第三种不定态。其实这就是C++或者其他高级语言最终执行的文件。所以理解里面的底层实现原理非常清楚,尤其是在深入了解计算机体系结构之后,就对于这个语言的实现细节非常了如指掌。剩下的大部分就是在C++这个语言协议或者规则里面去开发。这是最基础的工作,如果涉及到类似于金融行业的高频交易,又或者无人驾驶里面,就非常讲究实现的效率了。这个时候,对于内部CPU(不管是intel通用CPU还是ARM内核)的工作原理就要非常熟悉了。这个时候更多考虑的是实时性和高效性了,个人是这么感觉的,因为从FPGA实现来说是这样的,不同的代码架构,虽然实现相同的功能,但是其throughput/delay/timing就有很大差别。这个时候就要非常熟悉FPGA内部的架构才能实现性能优化。同理,对于C++也一样。

C++语言更多的是给我的感觉就是越来越模块化,也就是“class”。我认为这是整个语言的精髓,也就是OOP。记得之前说“program = algorithm + data”,现在来看应该是“program = class + class + …… + message”。什么是类呢?类就是一种抽象的概念,把某些具象的东西,抽象成共同具有某些特征的集合。而对象则是类的具体实例(instance)。结合高等数学的概念,更容易理解。如果对于函数f(x)的定义域内任意的一个x,都有f(x)=f(-x),那么函数f(x)就叫做偶函数(Even Function)。其实从C++角度来看,这就是类的概念。而f(x)= |x| (x∈R),这就是对象的概念。当然类可不止这么简单。还有很多细节需要去学习,个人觉得可能就是类的设计或者实现会影响到program的实现复杂性和高效性。

类的格式:

class 类名
{
   private:
      私有的数据和成员函数
   public:
      私有的数据和成员函数
};

private和public是成员访问限定符(member access specifier)。声明为private的只能被本类中的成员函数访问,类外不可以(有元类除外),声明为public的既可以被本类的成员函数访问,也可以被类的作用域以外的成员函数引用。还有很多细节东西,用得多了再回头看就好了。最后以第二章最后一个程序结束,基本有点工程的意思了。

#include <string>

using namespace std;
class Student
{
    public:
        void display();
    private:
        int num;
        string name;
        char sex;
};
#include <iostream>
#include "Student.hpp"

void Student::display()
{
    cout <<"num = " << num << endl;
    cout <<"name = " << name << endl;
    cout <<"sex = " << sex << endl;
    
}

#include <iostream>

#include "Student.hpp"

using namespace std;



int main()

{

    Student stud;

    stud.display();

    return 0;

}

在面向对象开发中,一般做法将类的声明(包括成员函数声明)放在指定头文件中。同时为了实现信息的隐蔽性,对成员函数的定义一般也不放在头文件中,而放在另外一个文件中。如上的三个文件系统。一个是主模块main.cpp,一个是student.cpp。主模块中又包含student.h。在预编译的时候,会将头文件student.h的内容取代#include "studen.hpp"。

由于类库的实现,用户可以在工作实践中,积累通用的或者专用的类,这就大大减少了程序设计的工作,有效的提高了效率。

(这就有点xilinx的vivado所做,设计是围绕IP开发的)




猜你喜欢

转载自blog.csdn.net/nearcsy/article/details/80876934