差分
このページの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には結構罠があるので注意が必要だ。 | ||