ONNXRuntime原始碼閱讀(一)
阿新 • • 發佈:2022-03-13
在構建一個推理模型時(如NanoDet,一個目標檢測模型),需要繼承 BasicOrtHandler。BasicOrtHandler 的初始化函式中會呼叫 initialize_handler() 方法,該方法會對 Ort::Env ort_env(構建在棧上)、Ort::Session ort_session(構建在堆上)等屬性進行初始化。接著深入到 Ort::Env 中,該類就定義在檔案 onnxruntime/onnxruntime/core/session/onnxruntime_cxx_api.h 中,值得注意的是在這個檔案中存在一個很重要的模板類 Base:
template <typename T> struct Base { using contained_type = T; Base() = default; Base(T* p) : p_{p} { if (!p) ORT_CXX_API_THROW("Allocation failure", ORT_FAIL); } ~Base() { OrtRelease(p_); } operator T*() { return p_; } operator const T*() const { return p_; } /// \brief Releases ownership of the contained pointer T* release() { T* p = p_; p_ = nullptr; return p; } protected: Base(const Base&) = delete; // 拷貝構造:刪除 Base& operator=(const Base&) = delete; // 拷貝賦值:刪除 Base(Base&& v) noexcept : p_{v.p_} { v.p_ = nullptr; } // 支援移動構造 void operator=(Base&& v) noexcept { OrtRelease(p_); p_ = v.release(); } T* p_{}; template <typename> friend struct Unowned; // This friend line is needed to keep the centos C++ compiler from giving an error };
可以看出,這裡實現了類似於 unique_ptr 的功能。在該檔案中,有許多類繼承被 Base 包裝後的基類,如 Env 繼承自 Base