gnss-sdr代码解读(1)

gnss-sdr代码解读(1)

作者微信公众号:小卫星

 

1、main.cc

      看一个庞大的程序,首先是聚焦主要框架,因此main里面这句最重要:

std::unique_ptr control_thread(new ControlThread());

          unique_ptr(C++11)

         unique_ptr指不共享它的指针。它无法复制到其他 unique_ptr,无法通过值传递到函数,也无法用于需要副本的任何标准模板库 (STL) 算法。只能移动unique_ptr。这意味着,内存资源所有权将转移到另一 unique_ptr,并且原始 unique_ptr 不再拥有此资源。 

        std::unique_ptr实现了独享所有权的语义。一个非空的std::unique_ptr总是拥有它所指向的资源。转移一个std::unique_ptr将会把所有权也从源指针转移给目标指针(源指针被置空)。拷贝一个std::unique_ptr将不被允许。因此std::unique_ptr是一个仅能移动(move_only)的类型。当指针析构时,它所拥有的资源也被销毁。默认情况下,资源的析构是伴随着调用std::unique_ptr内部的原始指针的delete操作的。 

        unique_ptr不像shared_ptr一样拥有标准库函数make_shared来创建一个shared_ptr实例。要想创建一个unique_ptr,我们需要将一个new 操作符返回的指针传递给unique_ptr的构造函数。

示例:(引自https://www.cnblogs.com/DswCnblog/p/5628195.html)

//

int main()

{

    unique_ptr pInt(new int(5));

    cout << *pInt;

}

//

int main()

{

    unique_ptr pInt(new int(5));

    unique_ptr pInt2 = std::move(pInt);    // 转移所有权

    //cout << *pInt << endl; // 出错,pInt为空

    cout << *pInt2 << endl;

    unique_ptr pInt3(std::move(pInt2));

}

//

unique_ptr clone(int p)

{

    unique_ptr pInt(new int(p));

    return pInt;    // 返回unique_ptr

}

int main() {

    int p = 5;

    unique_ptr ret = clone(p);

    cout << *ret << endl;

}

control_thread->run();

2、control_thread.cc

       在该类的构造函数中实现了

configuration_ = std::make_shared(FLAGS_config_file);

     make_shared函数的主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr;由于是通过shared_ptr管理内存,因此一种安全分配和使用动态内存的方法。

       FLAGS_config_file是在哪里定义的呢?(不好意思,暂时还没找到)

       在该类的构造函数中调用了它的函数init(),里面主要有两句:

control_queue_ = gr::msg_queue::make(0);

flowgraph_ = std::make_shared(configuration_, control_queue_);

       第一句在

https://www.gnuradio.org/doc/doxygen/classgr_1_1msg__queue.html

里有说明,好吧,其实没有说明,就这一句:static sptr gr::msg_queue::make(unsigned int limit = 0)

而第二句直接调用了GNSSFlowgraph

3、gnss_flowgraph.cc

       在该类的构造函数中调用了它的函数init(),里面主要有两句:

std::unique_ptr block_factory_(new GNSSBlockFactory());

std::shared_ptr>> channels = block_factory_->GetChannels(configuration_, queue_);

      第句直接调用了GNSSBlockFactory

      句直接调用了GNSSBlockInterface。注意第二句的结构:

              Ø 第一层:std::unique_ptr

              Ø 第二层:std::vector<...>

              Ø 第三层:std::shared_ptr<...>

      因此channels 是一个vector的指针,因此channels->at(i)传回索引i所指的数据的指针。

std::shared_ptr chan_ = std::move(channels->at(i));

      这句就是把这个指针移动给chan_,因为它是unique_ptr,因此只能move

      接着这句有一句:

channels_.push_back(std::dynamic_pointer_cast(chan_));

      channels_gnss_flowgraph.h中定义:std::vector> channels_;

      vectorpush_back是将数据加入到vector尾部。

      C++ 中提供了四种强制类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast。而shared_ptr 无法利用这些原始的操作符进行转换,其定义了自己的类型转换操作符:static_pointer_cast, dynamic_pointer_cast, const_pointer_cast

     可见在这里chan_被强制从GNSSBlockInterface类型转换为了ChannelInterface 

你可能感兴趣的:(VC++,GNSS)