cyber/python/
1.example:
from cyber.python.cyber_py3 import record
from google.protobuf.descriptor_pb2 import FileDescriptorProto
2.cyber/python/cyber_py3/record.py
import importlib
wrapper_lib_path=
_CYBER_RECORD = importlib.import_module('lib_cyber_record_wrapper')
class RecordReader(object):
构建配置
py_library(
name = "record",
srcs = ["record.py"],
data = [
"//python/internal:_cyber_record_wrapper.so",
],
deps = pb_deps
)
3.cyber/python/internal/py_record.cc
#include "cyber/python/internal/py_record.h"
#include <Python.h>
using apollo::cyber::record::PyRecordReader;
using apollo::cyber::record::PyRecordWriter;
py_record.h
include "cyber/record/record_reader.h"
include "cyber/record/record_write.h"
构建配置
"_cyber_record_wrapper.so",
apollo_cc_binary(
name = "_cyber_record_wrapper.so",
srcs = ["py_record.cc"],
linkshared = True,
linkstatic = True,
deps = [
":py_record",
],
)
4.cyber/record/record_reader.h
cyber/record/record_write.h
#include <sstream>
cyber/tools/cyber_channel/cyber_channel.py
from cyber.python.cyber_py3 import cyber_time
from cyber.python.cyber_py3 import cyber
cyber_recorder 是一个功能强大的工具,支持录制、回放、查询、分割和修复 Cyber RT 的通信数据
record play info split recover
cyber/tools/cyber_recorder/recorder.h
#include "cyber/record/record_writer.h"
cyber/tools/cyber_recorder/player/play_task_producer.h
#include "cyber/record/record_reader.h"
#include "cyber/record/record_viewer.h"
cyber/tools/cyber_recorder/spliter.h
#include "cyber/record/file/record_file_reader.h"
#include "cyber/record/file/record_file_writer.h"
cyber/tools/cyber_recorder/recoverer.h
#include "cyber/record/file/record_file_reader.h"
#include "cyber/record/file/record_file_writer.h"
#include "cyber/record/file/record_file_reader.h"
#include <fstream>
cyber/record/
cyber/record/record_reader.h
cyber/record/file/record_file_reader.h
这两者之间的不同,从include 数据流的库可以看出
一个是 #include <sstream> 一个是#include <fstream>
从内存到文件--从文件到内存 record play
从文件到文件 split recover
cyber/record/record_reader.h
#include "cyber/record/file/record_file_reader.h"
cyber_record
srcs = [
"header_builder.cc",
"record_reader.cc",
"record_viewer.cc",
"record_writer.cc",
"file/record_file_base.cc",
"file/record_file_reader.cc",
"file/record_file_writer.cc",
]
具体的
cyber/record/record_base.h
class RecordBase
cyber/record/file/record_file_base.h
class RecordFileBase
Open() Close()
GetPath() GetHeader() GetIndex() CurrentPosition()
SetPostion
class RecordReader:public RecordBase
Recorder
Section Header Index Channel ChunkHeader ChunkBody
std::shared_ptr<RecordReader> record_reader_prt = std::make_shared<RecordReader>(readfile);
std::shared_ptr<RecordViewer> recorder_view = std::make_shared<RecorderViewer>(record_reader_prt);
for(const auto&message: *recorder_view){
}
## std::make_shared 是创建 std::shared_ptr 的推荐方式之一 避免了直接使用 new 操作符。
### 创建一个 指向动态分配的 对象 的std::shared_ptr智能指针
合理使用std::make_shared和嵌套结构,可以有效地管理复杂的对象关系和生命周期。
对象: static
全局对象
局部自动对象 只有当定义它的函数被调用时才存在的对象称为自动对象。自动对象在每次调用函数时创建和撤销。该类型局部变量存储在栈上
static关键字修饰的局部变量。静态局部变量存储在静态存储区,生命期贯穿整个程序运行期间
分配在栈内存和静态内存的对象由 编译器 自动创建和销毁
动态分配内存的对象
free_store 堆heap --dynamically allocate--程序运行时分配的对象
动态内存管理
0.1版本 pointer : new delete
02.版本-smart pointer : shared_ptr uniq_ptr
智能指针使用模板-创建的时候必须 提供指针可以指向的类型信息
智能指针
#include <memory>
智能指针其实是一些模板类,它们负责自动管理一个指针的内存,免去了手动 new/delete 的麻烦,
这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针
定义
初始化: 默认初始化的智能指针保存一个空指针
make_shared<T>()
使用: 解引用 一个智能指针返回其指向的对象
*p
p->mem *p.mem
p.get()
p.swap(q)
标准类型库
#include<vector>
// 类模板 编译器根据模板 创建类或者函数的过程称为 实例化--
// 使用模板应告诉编译器把类或者函数实例化成何种类型 模板名字后跟一对尖括号,括号内放上信息
using std::vector;
vector<vector<string>> file;
C++ 中 #include后 尖括号(< >)和双引号(" ")
C++中 template 尖括号 用于定义模板 template <typename T>
C+++中标准库 模板类的 尖括号内定义了类型参数
容器类 出于 不知道自己需要使用多少对象而 使用智能指针
程序不知道所需要的对象的准确数据类型
程序在多个对象中共享数据