C++でもheaplessが欲しい
Rustを学んでいたら、heaplessというクレートがあるのを知りました。なんでも、メモリの動的確保を行わないデータ構造ライブラリとのこと。
ベアメタルでの組み込みソフト開発歴が長い私は、C++ではnewやstd::vectorなど動的メモリ確保を行う操作を行わないでプログラミングを行うことが多く、固定サイズのメモリを使ったリングバッファクラスなどを自作(車輪の再発明)したりしていました。
Rustにheaplessのようなライブラリがあるなら、C++にも当然あるだろうと思って調べたところ、使えそうなライブラリを2つ見つけたので紹介したいと思います。
ETL : Embedded Template Library
- 公式サイト(etlcpp.com)
- リポジトリ(GitHub)
- ライセンス:MITライセンス
開発の経緯はスポンサー募集ページに少し書かれています。勤務先を変わるたびに同じようなコードを再開発するのが面倒なので、個人で開発しオープンソースとして公開したそうです。
ちなみに、Arduinoでも使えるようです。ライブラリマネージャで出てきました。
etl::vector
std::vectorのテンプレートパラメータに最大サイズを指定することで、メモリ配置をコンパイル時に決定しています。
#include <etl/vector.h>
#include <iostream>
int main()
{
etl::vector<int, 5> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
myVector.push_back(4);
myVector.push_back(5);
for(int i : myVector)
{
std::cout << i << std::endl;
}
return 0;
}
その他のETLの機能
Overviewに記載の通り。
- Containers : メモリ動的確保しないコンテナ。vector、map、listなど。
- Patterns : デザインパターン。singleton、observer、visitorなど。
- Maths : 数学系機能。ハッシュ、CRCなど。
- Utilities : 便利機能。iterator、algorithmなど。
- Frameworks : フレームワーク。ステートマシン、メッセージングなど。
注目すべきはFrameworksでしょうか。
EASTL : Electronic Arts Standard Template Library
- リポジトリ(GitHub)
- ライセンス:3条項BSDライセンス
Electronic Artsというのをどこかで聞いたことがあると思ったら、「ザ・シムズ」「シムシティ」などのゲームを開発している会社でした。私は初代PlayStationで「テーマパーク」をプレイしていたのが記憶に残っています。
ゲーム開発も組込みソフトウェアと同じように限られたリソースの上で動作させなければいけないことが多く、STLの欠点を補うべく作られたようです。(参考:EASTL から垣間見るゲームソフトウェア開発現場の現状 その 1)
eastl::fixed_vector
etl::vectorと同じく、std::vectorのテンプレートパラメータに最大サイズを指定することで、メモリ配置をコンパイル時に決定しています。違いは3つめのテンプレートパラメータで、ここにfalseを指定するとオーバーフロー時のメモリ拡張をしないようになり、メモリの動的確保を行わなくなります。trueを指定すると、配置new用のメモリアロケータを別途定義する必要があります。
#include <EASTL/fixed_vector.h>
#include <iostream>
int main()
{
eastl::fixed_vector<int, 5, false> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
myVector.push_back(4);
myVector.push_back(5);
for(int i : myVector)
{
std::cout << i << std::endl;
}
return 0;
}
その他のEASTLの機能
Modules.mdによると、EASTLの機能はコンテナやイテレータに限られているようです。
おまけ:vcpkgの利用
ETL,EASTLともに、vcpkg(C++のパッケージマネージャ)でインストールできました。C++はこれまでパッケージマネージャが貧弱でしたが、最近はvcpkgがVisual Studioに統合できるようになって便利になってきました。
参考:C++用パッケージマネージャ「vcpkg」をVisual Studioに統合する - SKSP-TECH
終わりに
今回のコード(VS2022使用)はこちら https://github.com/ktetsuo/CppHeaplessTrial
車輪の再発明は楽しいですがほどほどに…