差分
このページの2つのバージョン間の差分を表示します。
次のリビジョン | 前のリビジョン | ||
blog:2017:2017-01-20 [2017-01-20 20:53] Decomo 作成 |
blog:2017:2017-01-20 [2017-01-24 11:13] (現在) Decomo |
||
---|---|---|---|
行 1: | 行 1: | ||
====== FName:: | ====== FName:: | ||
- | Unreal Engine 4の軽量文字列クラス'' | + | お急ぎのあなたのために、まずは結論。< |
- | 実証コード。 | + | Unreal Engine 4の軽量文字列クラス'' |
<code c++> | <code c++> | ||
行 131: | 行 131: | ||
LogWindows: | LogWindows: | ||
LogWindows: | LogWindows: | ||
- | LogWindows: abc == ABC | ||
</ | </ | ||
- | FNameはハッシュ付き文字列として実装されている。文字列はFNameの共用領域に格納され、各FNameインスタンスはその文字列格納領域へのインデックス=ハッシュを保持してる。FNameの比較は互いのハッシュの比較、つまり整数の比較に還元されるため、通常の文字列比較より早いっていう仕組みなんですな。 | + | FNameはハッシュ付き文字列として実装されている。文字列はFNameの共用領域に格納され、各FNameインスタンスはその文字列格納領域へのインデックス=ハッシュを保持してる。FNameの同士の比較は互いのハッシュの比較、つまり整数の比較に還元されるため、通常の文字列比較より速いって仕掛けなんですな。 |
- | このハッシュ生成方法がちょっと曲者で、文字列が「**アンダースコア+ゼロ詰めされていない数値で終わって**いたら、その部分を除いた文字列を共用領域に格納し、数値は各FNameインスタンスで保持する」という方法なのだ。割と最近のバージョンアンプで変わったらしい(知人曰く4.12あたりで変わった気がすると)。なかなか破壊的な変更をしてくださりやがるな! | + | ただ、このハッシュ生成方法がちょっと曲者で、**文字列がアンダースコア+ゼロ詰めされていない数値で終わっていたら、その部分を除いた文字列を共用領域に格納し、数値は各FNameインスタンスで保持する**という方法なのだ。割と最近のバージョンアンプで変わったらしい(知人曰く4.12あたりで変わった気がすると)。なかなか破壊的な変更をしてくださりやがるな!言葉だと分かりにくいので図を作ってみた。 |
- | ここでもう一度実行結果を見てみると、条件に合致するHoge_10, | + | {{ : |
+ | 図を踏まえつつ改めて実行結果を見てみると、条件に合致するHoge_10, | ||
+ | |||
+ | UE4では生成されたオブジェクトのインスタンスに対し、オブジェクト名+連番の名前を自動付与するため、大規模な開発になるとFName文字列ストアの肥大化が無視できなくなり、保持方法を変更したのだと思われる。 | ||
+ | |||
+ | こんな格納の仕方で大丈夫なの!?と思うが、ふつーに'' | ||
+ | |||
+ | ちなみに、実行結果内の'' | ||
+ | |||
+ | <code c++> | ||
+ | FName abc(TEXT(" | ||
+ | FName ABC(TEXT(" | ||
+ | UE_LOG(LogWindows, | ||
+ | </ | ||
+ | |||
+ | 念のため上記コードで確認したら、'' | ||
+ | |||
+ | 掘ってみるとFNameには結構罠があるので注意が必要だ。 |