3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C++Advent Calendar 2024

Day 24

C++でヒープを使わないSTL代替ライブラリ2選

Last updated at Posted at 2024-12-23

C++でもheaplessが欲しい

Rustを学んでいたら、heaplessというクレートがあるのを知りました。なんでも、メモリの動的確保を行わないデータ構造ライブラリとのこと。
ベアメタルでの組み込みソフト開発歴が長い私は、C++ではnewやstd::vectorなど動的メモリ確保を行う操作を行わないでプログラミングを行うことが多く、固定サイズのメモリを使ったリングバッファクラスなどを自作(車輪の再発明)したりしていました。
Rustにheaplessのようなライブラリがあるなら、C++にも当然あるだろうと思って調べたところ、使えそうなライブラリを2つ見つけたので紹介したいと思います。

ETL : Embedded Template Library

開発の経緯はスポンサー募集ページに少し書かれています。勤務先を変わるたびに同じようなコードを再開発するのが面倒なので、個人で開発しオープンソースとして公開したそうです。

ちなみに、Arduinoでも使えるようです。ライブラリマネージャで出てきました。
image.png

etl::vector

std::vectorのテンプレートパラメータに最大サイズを指定することで、メモリ配置をコンパイル時に決定しています。

etl::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

Electronic Artsというのをどこかで聞いたことがあると思ったら、「ザ・シムズ」「シムシティ」などのゲームを開発している会社でした。私は初代PlayStationで「テーマパーク」をプレイしていたのが記憶に残っています。

ゲーム開発も組込みソフトウェアと同じように限られたリソースの上で動作させなければいけないことが多く、STLの欠点を補うべく作られたようです。(参考:EASTL から垣間見るゲームソフトウェア開発現場の現状 その 1

eastl::fixed_vector

etl::vectorと同じく、std::vectorのテンプレートパラメータに最大サイズを指定することで、メモリ配置をコンパイル時に決定しています。違いは3つめのテンプレートパラメータで、ここにfalseを指定するとオーバーフロー時のメモリ拡張をしないようになり、メモリの動的確保を行わなくなります。trueを指定すると、配置new用のメモリアロケータを別途定義する必要があります。

eastl::fixed_vectorの使用例
#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

車輪の再発明は楽しいですがほどほどに…

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?