1. ホーム
  2. dart

[解決済み] constコンストラクタは実際にどのように動作するのですか?

2022-04-21 21:59:14

質問

Dartではコンストラクタを作成することが可能なことに気づきました。ドキュメントには、次のように書かれています。 const は、コンパイル時の定数であることを示すために使用されます。

を使うとどうなるんだろうと思っていたら const コンストラクタを使用してオブジェクトを作成します。これは、常に同じでコンパイル時に利用可能な不変のオブジェクトのようなものでしょうか?のコンセプトはどのようなものでしょうか? const コンストラクタは実際に機能するのですか?どのように コンスト のコンストラクタとは異なります。 正規 のコンストラクタは?

解決方法は?

Const コンストラクタは、"canonicalized" インスタンスを作成します。

つまり、すべての定数表現は正規化された状態で始まり、後にこれらの定数の等価性を認識するために、この "canonicalized"シンボルが使用されます。

正準化。

複数の表現が可能なデータを、標準的な表現に変換する処理。これは、異なる表現の等価性を比較するため、異なるデータ構造の数を数えるため、繰り返しの計算を排除して様々なアルゴリズムの効率を向上させるため、あるいは意味のあるソート順序を課すために行われる。


これは、以下のようなconst式が const Foo(1, 1) は、仮想マシンでの比較に有用な任意の使用可能な形式を表すことができます。

VMは、このconst式で出現する順番に、値の型と引数を考慮すればよいのです。そしてもちろん、最適化のためにそれらは削減される。

同じ正規化された値を持つ定数。

var foo1 = const Foo(1, 1); // #Foo#int#1#int#1
var foo2 = const Foo(1, 1); // #Foo#int#1#int#1

正規化された値が異なる定数(シグネチャが異なるため)。

var foo3 = const Foo(1, 2); // $Foo$int$1$int$2
var foo4 = const Foo(1, 3); // $Foo$int$1$int$3

var baz1 = const Baz(const Foo(1, 1), "hello"); // $Baz$Foo$int$1$int$1$String$hello
var baz2 = const Baz(const Foo(1, 2), "hello"); // $Baz$Foo$int$1$int$2$String$hello

定数は毎回再作成されるわけではありません。コンパイル時に正規化され、特別なルックアップテーブル (ここで正規化された署名でハッシュ化されます) に格納され、そこから後で再利用されるのです。

追伸

フォーム #Foo#int#1#int#1 これらのサンプルで使用されているものは、比較のために使用されているだけであり、Dart VMにおける実際の正規化(表現)の形ではありません。

しかし、本当の正準化はquot;standard"正準表現でなければなりません。