質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

3回答

6821閲覧

C# ループの中で変数の初期化をする場合のメモリの負荷や処理速度について

gucha

総合スコア55

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/04/19 13:51

オープンソースのコードで遭遇したものなんですが、変数の初期化とメモリについて基本的なことも含めて確認したいことがあります。

whileループの中で変数の初期化と値のセットを行い、直後にもう一度値のセットをしているコードを見かけました。
この直後に行う値の再配置には何か意味があるのでしょうか?
メモリの負荷軽減や処理速度に関わるのではないかと考えました。

C#

1public Thread Tobj; 2 3public void start() 4{ 5 if (Tobj == null) 6 { 7 Tobj = new Thread(new ThreadStart(prc)); 8 Tobj.Start(); 9 } 10} 11 12private void prc() 13{ 14 while (true) 15 { 16 int a = getRaw(); 17 a = getRaw(); //この部分は必要? 18 19 if (a > 0) 20 { 21 Console.WriteLine(a); 22 } 23 } 24}

また変数の初期化だけループの外で行った場合もメモリの負荷に違いなどはあるのかも疑問に思いました。

C#

1private void prc() 2{ 3 int a; 4 while (true) 5 { 6 a = getRaw(); 7 8 if (a > 0) 9 { 10 Console.WriteLine(a); 11 } 12 } 13}

変数の初期化直後の値の再配置に意味はあるのか?
またループの外で変数を初期化してループ内では値の設定だけをする場合との違いはあるのか?
以上の2つが知りたいです。基本的な変数とメモリの負荷について理解できていない状態ですがご教示お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

私も getRaw()が分かりません。名前からして、Rawデータ読み込みでしょうか?
最初のデータを読み捨てという意味でしょうか? それならば、アリ。

2つめの変数の初期化ですが、これは変数の宣言ですね。
初期の C(C#の元)は、関数の最初でしか、変数を宣言できなかったのでその名残かと思います。あるいは、ループの外で値を参照したいかのどちらかでしょう。

その辺しか、思いつきません。
また、この程度は、コンパイル時の最適化を考慮した場合、誤差としか思えません。
分かり易さが優先の範囲と考えます。

投稿2018/04/19 14:29

pepperleaf

総合スコア6383

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gucha

2018/04/19 14:37

getRaw()では入力されている物理キーを確認して対応する値を返すというものでした。 常に監視させておくのでスレッドを分けているのだと思いました。 コンパイルで最適化されるということも知りませんでした。
guest

0

ベストアンサー

getRaw() が何をやっているのかもわかりませんが、意味があるとは思えません。
新しいスレッドでコンソールに数値を出力するのも何の意味があるのかわかりません。

オープンソースということですが、オープンソースのソフトはだれでも作れますので品質が良いとは限りません。手本になるソースとは限らないでしょう。
メモリの負荷軽減や処理速度には寄与しないと思います。

###追記
ループの外での変数の宣言にもループの外で利用していない以上、意味がありません。利用していないスコープが変わるだけで IL レベルでは同じものになります。

投稿2018/04/19 14:21

編集2018/04/19 14:45
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gucha

2018/04/19 14:45

やはり今回のケースでは特に差異はないのですね。 回答ありがとうございます。
guest

0

初期化直後に代入しているのはちょっとソースみないと分かりませんね

後者はループの外で変数を宣言することでスコープが変わります。

投稿2018/04/19 14:40

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問