C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.89151 の関連記事表示

<< 0 >>
■89151  C# 定数テーブル
□投稿者/ 774RR -(2018/11/02(Fri) 11:04:23)

    分類:[C#] 

    C でいう定数テーブルを C# で作りたいんですが、どう書くと一番効率よくて安全ですかね?

    C ソース
    uint16_t const crc16usb[] = {
    0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E ...
    };

    要するにコンパイル時に値が決定済みな静的定数テーブルを唯一つだけ定数領域に置いてプログラムと同じ寿命を持たせる、つまり gc 対象にしたくないわけなのですが C# の配列は参照型で new しないと作れないので gc 対象になるのがどうも気に入りません。
    readonly UInt16[] crc16usb = new UInt16[] { ... };
    をクラスメンバに置くのは効率悪いと思うし readonly を const にするとコンパイル通らないし。
親記事 /過去ログ153より / 関連記事表示
削除チェック/

■89154  Re[1]: C# 定数テーブル
□投稿者/ にゃるら -(2018/11/02(Fri) 12:33:26)
    2018/11/02(Fri) 12:55:27 編集(投稿者)

    No89151 (774RR さん) に返信

    > readonly UInt16[] crc16usb = new UInt16[] { ... };
    > をクラスメンバに置くのは効率悪いと思うし readonly を const にするとコンパイル通らないし。

    インスタンスメンバであればインスタンス数分になるので効率悪いと思ったのですけど、
    クラスメンバであれば一回しか作られないので、それほど効率悪くないかなって。

    static readonly UInt16[] crc16usb = new UInt16[] { ... };
記事No.89151 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89156  Re[2]: C# 定数テーブル
□投稿者/ 774RR -(2018/11/02(Fri) 14:43:49)
    現状 static readonly UInt16[] crc16table = {...}; として実用上の問題はないのですが
    根っからの native C/C++er としては初期値一覧と実際に使われる配列が別領域に配置されるか否かが
    微妙にというかとても気になります。今の時点で IL 読んでる暇がないっす。

    C# で最初にハマったのが const
    C# の const って真に const なので C++ でいう static const なのね。驚き。
記事No.89151 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89157  Re[3]: C# 定数テーブル
□投稿者/ ????? -(2018/11/02(Fri) 15:04:40)
    No89156 (774RR さん) に返信
    > 現状 static readonly UInt16[] crc16table = {...}; として実用上の問題はないのですが
    > 根っからの native C/C++er としては初期値一覧と実際に使われる配列が別領域に配置されるか否かが
    > 微妙にというかとても気になります。今の時点で IL 読んでる暇がないっす。
    > 
    > C# で最初にハマったのが const
    > C# の const って真に const なので C++ でいう static const なのね。驚き。
    
    C++勉強不足なので、質問したいのですけど。
    C#だとたとえば、
    
    ClassLibrary1.dll
        public class Class1
        {
            public const int NConst = 10000;
        }
     
    App.exe
        /// <summary>
        /// コンソールアプリ
        /// </summary>
        static class Program
        {
            static void Main()
            {
                Console.WriteLine(ClassLibrary1.Class1.NConst);
            }
        }
    
    としていったんビルドし、そのあとApp.exeを別の場所においておいてDllの方のNConstを1にしてビルドして、
    別の場所のApp.exeのところにDllを持っていって動かすと、変更後の「1」ではなく「10000」が出ます。
    
    このような動きになる定数がc++のstatic constっていうのでしょうか?
記事No.89151 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89158  Re[4]: C# 定数テーブル
□投稿者/ にゃるら -(2018/11/02(Fri) 15:05:09)
    No89157 (????? さん) に返信

    名前入れ忘れました。すみません。。
記事No.89151 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89161  Re[5]: C# 定数テーブル
□投稿者/ 774RR -(2018/11/02(Fri) 16:00:55)
    いや C++ の static const はコンパイル時に命令語に展開されることを期待するものです。

    static const int myconst = 3;
    int func() { return myconst; }
    なる関数を作ったら機械語で "MOV.L #3, R1" になることをプログラマは期待します。
    機械語レベルでイミディエイトになれば「変数」を参照する必要がないわけで、
    リンク時最適化により myconst なる変数は消去されることすら期待されています。
    (それを究極まで進めたのが constexpr )

    C# で static const int MySize = 4; と書いたら怒られたのが衝撃的でした。

記事No.89151 のレス /過去ログ153より / 関連記事表示
削除チェック/

■89180  Re[6]: C# 定数テーブル
□投稿者/ にゃるら -(2018/11/05(Mon) 12:27:41)
    No89161 (774RR さん) に返信
    > 機械語レベルでイミディエイトになれば「変数」を参照する必要がないわけで、
    > リンク時最適化により myconst なる変数は消去されることすら期待されています。

    そういったことまで含めた「安全」というところまでは私は普段意識しないので感覚的に理解できていませんでした。
    コーディングで「定数」として扱われるというレベルでの安全性しか考慮したことがないもので。

    # dumpbinでstatic constがMov命令のオペランドに実値で埋め込まれるのを確認しました。

    本来の「質問」ではないのに逆質問をすることになってしまい、すみませんでした。




記事No.89151 のレス /過去ログ153より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -