構成
コンパイラセットアップ
Boost.Config サブシステムがあるため、Boost.Regex を使うのに特別な構成は必要ない。問題がある場合(あるいは一般的でないコンパイラやプラットフォームを使う場合)は Boost.Config に構成スクリプトがあるので、そちらを使うとよい。
ロカールおよび特性クラスの選択
ユーザのロカール(locale)を Boost.Regex がどのように処理するか制御するには、以下のマクロ(user.hpp
を見よ)を使う。
-
BOOST_REGEX_USE_C_LOCALE
Boost.Regex が、特性クラス中で大域 C ロカールを使うように強制する。C++ ロカールがあるのでこの設定は現在非推奨となっている。
-
BOOST_REGEX_USE_CPP_LOCALE
Boost.Regex が、既定特性クラス中で
std::locale
を使うように強制する。各正規表現はインスタンス固有のロカールによりimbue
される。これは Windows 以外のプラットフォームにおける既定の動作である。
-
BOOST_REGEX_NO_W32
Boost.Regex は(利用可能な場合でも)あらゆる Win32 API を使用しない(
BOOST_REGEX_USE_C_LOCALE
が設定されない限りBOOST_REGEX_USE_CPP_LOCALE
が暗黙に有効になる)。
リンケージに関するオプション
-
BOOST_REGEX_DYN_LINK
Microsoft C++ および Borland C++ ビルドでは Boost.Regex の DLL ビルドにリンクするようになる。既定では Boost.Regex は、動的 C 実行時ライブラリを使用している場合であっても静的ライブラリにリンクする。
-
BOOST_REGEX_NO_LIB
Microsoft C++ および Borland C++ において、Boost.Regex がリンクするライブラリを自動的に選択しないようにする。
-
BOOST_REGEX_NO_FASTCALL
Microsoft ビルドにおいて、__fastcall 呼び出し規約よりも __cdecl 呼び出し規約を使用する。マネージ・アンマネージコードの両方から同じライブラリを使用する場合に有用。
アルゴリズムの選択
-
BOOST_REGEX_RECURSIVE
スタック再帰マッチアルゴリズムを使用する。これは通常最速のオプションである(といっても効果はわずかだが)が、極端な場合はスタックオーバーフローを起こす可能性がある(Win32 では安全に処理されるが、その他のプラットフォームではそうではない)。
-
BOOST_REGEX_NON_RECURSIVE
非スタック再帰マッチアルゴリズムを使用する。スタック再帰に比べて若干遅いが、どれだけ病的な正規表現に対しても安全である。これは Win32 以外のプラットフォームにおける既定である。
アルゴリズムの調整
以下のオプションは BOOST_REGEX_RECURSIVE
が設定されている場合のみ有効である。
-
BOOST_REGEX_HAS_MS_STACK_GUARD
Microsoft スタイルの __try - __except ブロックがサポートされており、スタックオーバーフローを安全に捕捉できることを Boost.Regex に通知する。
以下のオプションは BOOST_REGEX_NON_RECURSIVE
が設定されている場合のみ有効である。
-
BOOST_REGEX_BLOCKSIZE
非再帰モードにおいて Boost.Regex は状態マシンのスタックのために大きめのメモリブロックを使う。ブロックのサイズが大きいほどメモリ確保の回数は少なくなる。既定は 4096 バイトであり、大抵の正規表現マッチでメモリの再確保が必要ない値である。しかしながらプラットフォームの特性を見た上で、別の値を選択することも可能である。
-
BOOST_REGEX_MAX_BLOCKS
サイズ
BOOST_REGEX_BLOCKSIZE
のブロックをいくつ使用できるか設定する。この値を超えると Boost.Regex はマッチの検索を停止し、std::runtime_error
を投げる。既定値は 1024 である。BOOST_REGEX_BLOCKSIZE
を変更した場合、この値にも微調整が必要である。
-
BOOST_REGEX_MAX_CACHE_BLOCKS
内部キャッシュに格納するメモリブロック数を設定する。メモリブロックは
::operator new
呼び出しではなくこのキャッシュから割り当てられる。一般的にこの方法はメモリブロック要求のたびに::operator new
を呼び出すよりも数段高速だが、巨大なメモリチャンク(サイズがBOOST_REGEX_BLOCKSIZE
のブロックが最大 16 個)をキャッシュしなければならないという欠点がある。メモリの制限が厳しい場合は、この値を 0 に設定し(キャッシュはまったく行われない)、それで遅すぎる場合は 1 か 2 にするとよい。逆に巨大なマルチプロセッサ、マルチスレッドのシステムでは大きな値のほうがよい。