Re: immutableな静的配列の初期化

投稿ツリー


このトピックの投稿一覧へ

なし Re: immutableな静的配列の初期化

msg# 1.2.1.1
depth:
3
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 .2 | 投稿日時 2011/9/20 1:45
SHOO  管理人   投稿数: 658
>これはinitializerを指定する場合の要件で、initializerなしの場合(つまりコンストラクタでの初期化を行う場合)は当てはまらないと思います。

それについても一応気づいてはいましたが、初期化を初期化子で行うか、コンストラクタで行うかはあまり重要ではなく、データをROMに置くかRAMに置くかってなあたりが違うのかなと思いました。

+ 「非ローカルなimmutableなデータはROMに置かれる」が真であれば、ランタイムでの初期化はできません。
+ 「非ローカルなimmutableなデータは、初期化子で初期化されるか静的コンストラクタで初期化されるかで置かれる場所がROMとRAMで可変」だとすると、妥当といえば妥当かもしれませんが、なんかもやっとします。
+ 「非ローカルなimmutableなデータはRAMに置かれる」であればランタイムの初期化を行うことができます。つまり、静的コンストラクタで初期化しても問題ないはずです。

現状おそらく2番か3番あたりなのかなと勝手に想像していますが、仕様としては1番でも問題ないように書かれているのかなと思いまして。
実際にはimmutableなデータがどこに置かれようが、変更することは未定義動作なので、意識しなくてもいいところなのかなとは思いますが。
(なお、ただのstaticなデータも初期化子だとコンパイル時に値が決定、動的には静的コンストラクタでできるよと言っていますので、ROMとかRAMはあまり関係ないかも。)

> また型の上でもis(immutable(int) : shared(const(int)))なので、immutableな値はsharedでもあると考えたほうが自然だと思います。

これも当然わかってはいますが、だとすると仕様の曖昧な部分なのかなと思います。
仕様をそのまま言葉通りに捉えると、静的コンストラクタでは(通常のmutableな型と)shared型の変数のみ初期化でき、const(shared(T))型の変数やimmutable型の変数、const型の変数は初期化できない、とも見ることができます。(要するに、静的コンストラクタは型システムを無視して代入可能な特殊な関数ではない、とも言えます。((いや、でもどこぞでconstな値にもコンストラクタなら代入できるって話があったような…どこにそんなような話があったっけ)))

仕様の文言が、意図してこうなっているのか、意図せずこうなってしまっているのかよくわかりませんが、どちらにしろ曖昧なので記載を改善するべきじゃないかなと思います。
投票数:28 平均点:3.93
返信する

この投稿に返信する

題名
ゲスト名
投稿本文

  条件検索へ


メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu