12

現在、いくつかのファクトリ関数で boost.parameter を使用しており、コンパイル時間が法外になっています。

現在、次のような一般的なパターンがあります。

auto thing = makeThing(property1 = foo::bar, "myThing"_thingName);

wheremakeThingには 30 個のパラメータがあり、そのほとんどはデフォルトです。「名前付きパラメーターのような」構文と、位置ではなくタイプでパラメーターを一致させる機能を保持したいと思います。

ファクトリの呼び出しサイトで構文を変更せずにコンパイル速度を向上させるにはどうすればよいですか?

注: boost.MPL の速度と言う盗賊の速度の違いから判断すると、最新のメタ プログラミング手法が同等の boost.parameter で使用された場合、コンパイル時間は少なくとも 1 桁は改善されるはずです。

更新:これはまさに私がやっていることの要約された例です: ベアメタルの組み込みコンテキストでは、ポリシーベースのクラス設計イディオムに従って、複雑なテンプレート化されたクラスとして抽象化されたさまざまな周辺機器があります。各クラスはコンパイル時に多くの構成情報を取得し、必要な機能のみを使用します (すべての SFR 相互作用は監視可能であり、揮発性であるため許可されないため、未使用のものを取り除くためにオプティマイザーに頼ることはできません)。

これらのポリシーベースのクラスは、ユーザーが構成するのが非常に醜く、ほとんどの組み込みユーザーは、パブリック インターフェイスで < を見ると叫び声を上げて逃げるので、boost.parameter を使用して、タイプ エンコードされたすべてのウィッシュを渡すことができるセクシーなファクトリを作成します ( hana スタイルのように) 必要な ISR に接続し、ハンドルを返すローカルの静的としてクラスを生成します。

namespace usb
{
    BOOST_PARAMETER_NAME(hw)
    BOOST_PARAMETER_NAME(vid)
    BOOST_PARAMETER_NAME(pid)
    BOOST_PARAMETER_NAME(device_class)
    BOOST_PARAMETER_NAME(max_packet_ep0)
    BOOST_PARAMETER_NAME(max_packet)
    BOOST_PARAMETER_NAME(packet_pool_size)
    BOOST_PARAMETER_NAME(device_description)
    BOOST_PARAMETER_NAME(device_calss_description)
    BOOST_PARAMETER_NAME(can_power_down)
    BOOST_PARAMETER_NAME(stall_supported)
    BOOST_PARAMETER_NAME(setup_packet_timeout)
    //...

BOOST_PARAMETER_FUNCTION(
    (usb_handle),
    make,    

    tag,                 

    (required(hw, *)) 

    (optional
    (vid, *, 0x6001_ci)
        (pid, *, 0x1234_ci)
        (device_class, *, cdc_class{})
        (max_packet_ep0, *, 8_ci)
        (max_packet, *, 64_ci)
        (packet_pool_size, *, 12_ci)
        (device_description, *, "")
        (device_calss_description, *, "")
        (can_power_down, *, 0_ci)
        (stall_supported, *, 0_ci)
        (setup_packet_timeout, *, 100_ci)
        )
)
{
    // makes a local static policy based class taylored at compile time 
    // to support only the specified features
    return{};  //returns a handle to the local static
}
}

ほとんどのファクトリには 10 ~ 25 個のパラメーターがあり、プリプロセッサ時間が致命的なようです。ユーザーが実際に関数を呼び出すかどうかに関係なく、ファクトリごとに 1 ~ 5 秒かかります。

更新 2:報奨金は終了したため、解決策はないようです。時間があれば、boost.parameter の置き換えを作成し、ここにリンクします。また、boost.hana スタイルのセマンティクスに近づけるために、名前付きパラメーター関数の戻り値の型を入力の型に依存させるとよいでしょう。

4

1 に答える 1