ページ 11

記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 02:27
by ムンバ
こんばんはっ!

C言語?での、静的領域についての詳細(定義など)を知りたかったので
検索エンジン(←ヤホーですみません。)で「C言語 静的領域」と入力し、検索しました。

OS:Win NT(32bit) VC++2008(SP1)

===↓表題(タイトル・通称?)===

・記憶クラス
・4つの記憶クラス
・メモリの4領域
・変数の記憶クラス
・(その他、他にも色々ありました。)

===↑表題(タイトル・通称?)ここまで===


うまくお伝えできるかどうか、相変わらず不安なのですが・・・
お断り:疑問符(?)多くて、すみません。(汗

以下、記憶クラスの呼び名(通称の名前とでも言うのでしょうか?^^;)と
種類?(3つとか4つとか)について、箇条書きとさせて頂きます。


---メモリの領域---(括弧内入れて4種?)

 ・テキスト領域
 ・データ領域(静的領域 と ヒープ領域)
 ・スタック領域

---記憶クラス---(4種)

 ・自動変数
 ・静的変数
 ・外部変数
 ・レジスタ変数

---記憶クラスの種類---(3種)

 ・自動変数
 ・静的変数
 ・外部変数
 (・レジスタ変数無し?)

---C言語のメモリの使い方---(4種)

 ・コード(code)
 ・データ(data)
 ・ヒープ(heap)
 ・スタック(stack)

---C言語で扱うメモリ領域---(4種)

 ・プログラム領域
 ・静的領域
 ・スタック領域
 ・ヒープ領域

---記憶クラス指定子---(4種?)

 変数の内部
 ・auto(記憶場所:スタック)
 ・register(記憶場所:レジスタまたはスタック)
 ・static(記憶場所:静的領域)
 ・extern(他で定義されている外部変数をこの関数ないで 使用できることを宣言する)

 変数の外部
 ・なし(記憶場所:静的領域)
 ・static(記憶場所:静的領域)
 ・extern(他で定義されている外部変数をこの関数ないで 使用できることを宣言する)


今の所、上述した(静的領域について)検索したページで
図解入りで一番、自分が解りやすいと思ったページが
ttp://www.sekine-lab.ei.tuat.ac.jp/lecture/MP/2004/part06/node8.html
でした。

各サイトを参照させて頂き(手持ちの教本も含め)静的領域について、理解できたと思うのですが
各サイトを参照させて頂いてるうちに
自分の頭の中が、さらにごちゃごちゃになってしまったので
ご意見頂ける方がいらっしゃいましたら、ご指導の程、宜しくお願いします。

相変わらずなのですが、悪意とか批判とか意地などなどでは無く
自分で言うのも変なのですが(自分は、変ですが。w)
純粋な質問です。
頭は単細胞なので、ごちゃごちゃになってます。

質問1:メモリの領域 == 記憶クラス

    この時点で、私は既にごちゃごちゃですか?
    総称はともかく、記憶クラスと呼ばれるのは「4種類」
    で、宜しいのでしょうか?<初心者向けで、お願い致します。

深夜に質問投げ捨てで、大変申し訳ないのですが寝てしまいます。
毎回、勝手で申し訳御座いません。
おやすみなさい!(∪。∪)。。。zzzZZ

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 04:13
by たかぎ
言語規格について知りたいのか、特定処理系の実装について知りたいのか、どちらでしょうか?

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 04:37
by ムンバ
たかぎさん、おはようございます。
お世話になります。

C言語を勉強中の超初級者(と言われる方)に対する、本やサイトに記載されている
記憶クラスについての解説での、質問です。

この様な質問をしておいて
色々な方針を目指して勉強されてる方々には、大変失礼かと思うのですが
言語規格と特定処理系の実装の区別も付きません。

さらに、ごちゃごちゃになってしまいました。(汗
すみません。
明るくなって来たので、今度こそ寝ます。
おやすみなさい!

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 04:40
by たかぎ
> 言語規格と特定処理系の実装の区別も付きません。

ここをゴチャマゼにすると、収拾がつかなくなります。

> C言語を勉強中の超初級者(と言われる方)に対する、本やサイトに記載されている
> 記憶クラスについての解説での、質問です。

超初級者が相手なら、こんな厳密な話はしないのでは?

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 12:36
by たかぎ
少し整理してみることにします。

まず、考慮しなければならない項目を列挙することにします。

・記憶クラス指定子(および記憶クラス)
・記憶域期間
・結合

これ以外のことはプラットフォームに依存します。
一般論で話すと非常に煩雑で難しくなりますが、必要ならざっとでも説明します。どうしますか?


Cの記憶クラス指定子には以下のものがあります。

・auto
・register
・extern
・static
・typedef

このうち、typedefはあくまでもシンタックス上の都合で記憶クラス指定子に分類されているだけなので、本当に記憶クラスを指定するものではありません。


記憶域期間には以下のものがあります。

・自動記憶域期間
・静的記憶域期間
・割付け記憶域期間


結合は以下のものがあります。

・外部結合
・内部結合
・無結合


これらの分類を字句に理解するようにしてください。

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 13:04
by ムンバ
おはようございます。

>>超初級者が相手なら、こんな厳密な話はしないのでは?

 14歳からはじめる C言語オンラインゲーム プログラミング教室(本)
 の、「C言語の文法をおさらいしよう」の中で「ポインタとメモリー管理のおさらい」
 という項目があって、ここでは(実際は図になってるんですが)

 ・スタック領域(ローカル変数はここに確保)
 ・コード領域
 ・静的領域(グローバル変数はここに確保)
 ・ヒープ領域
 ・システム予約領域

 と、領域が分かれている。
 「(1)グローバル変数を使う」のところで

グローバル変数は静的領域って領域に確保されるんだ。
と、思ったのが始まりで「静的領域」を検索かけまくったら
記憶クラスやメモリの領域など、たくさんの種別が出てきたので
質問させて頂きました。

現時点では、スタック領域と静的領域が理解できれば良いかと思うのですが
他の領域の名前ぐらいは覚えておいた方が良いのではないか?
と思ったので、検索したら、色々な領域の名前が出てきたので
ごちゃごちゃになってしまっての質問です。

つまり現時点では、領域の種類が知りたかっただけなのですが。(汗

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 13:10
by たかぎ
スタック領域などは、一応、特定処理系に特化した話になります。
あと、その本はCとC++の区別もあいまいになっているので、細かなところはあてにしない方がよいと思います。

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 13:34
by softya
まず、「14歳からはじめる C言語オンラインゲーム プログラミング教室」で言うところの
 ・コード領域
 ・システム予約領域
は自分で変更する処ではないので置いておきます。
あとの
 ・スタック領域(ローカル変数はここに確保)
 ・静的領域(グローバル変数はここに確保)
 ・ヒープ領域
で、ヒープ領域はmallocなどで使いますので理解しておいた方が良いでしょう。
静的領域は、static記憶クラスの変数も置かれますのでこれも理解しておいてください。ちなみにこの話は、プラットフォーム依存です。

中途半端な理解だと後々混乱というかデバッグでもプログラミングでも困ることになると思いますので、プッラットフォーム依存限定で良いのでたかぎさんの話を全て理解しておくことをお勧めします。

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 14:04
by たかぎ
>  ・スタック領域(ローカル変数はここに確保)
>  ・静的領域(グローバル変数はここに確保)
>  ・ヒープ領域

メモリマップを直接触ったり、アセンブリ言語を使うのでない限り、上記についてはわざわざ処理系依存の理解をする必要はありません。
つまり、実際に領域が"どこ"に割り付けられるは重要な問題ではなく、いつからいつまで割り付けられているかによる分類である記憶域期間だけ分かれば十分です。

関数の内部で、staticもexternも付けずに宣言されたオブジェクト、関数の仮引数、式の評価結果である一時オブジェクトは、すべて自動記憶域期間を持ちます。
関数の外、またはstaticを付けて宣言されたオブジェクトは静的記憶域期間を持ちます。
mallocやcallocで割り付けられたオブジェクトは割付け記憶域期間を持ちます。

Re:記憶クラス(メモリの領域?)につきまして

Posted: 2010年5月23日(日) 23:40
by ムンバ
おはようございます?!アンドすみません!
5時間近く、昼寝してしまいました。^^;
レス遅くなりました。すみません。

たかぎさん、softyaさん、お世話になります。
他の方々の、ご質問とご解説も、いつも見させて頂き、勉強させて頂いてます。
いつも、ご丁重なご解説どうもありがとうございます!

この項目、今後もゲームを作る上で一番大事な所なのではないかと自分なりに感じ
調べたり、こちらで質問してるうちに気が付いたら夜が明けてました。

それで誠に勝手ではありますが
まず、このページごと保存させて頂きました。
(定期的にバックアップするフォルダに保存したので
 消える事は無いと思います。w)

今すぐ、お二方のご解説を理解するのは無理だと思いますので
(私、本当に理解力に欠けてまして、ご迷惑お掛けしてます。)
この後、何度も読み返して整理していきたいと思います。

==============
たかぎさんへ
==============

>>一般論で話すと非常に煩雑で難しくなりますが、必要ならざっとでも説明します。どうしますか?

 すみません。止めといて下さい。(汗
 現時点では、今回のたかぎさんのご解説で自分には十分だと思います。(_ _)
 これ以上、突っ込まなければならなくなった際には
 勝手ながら、また質問させて頂きますので
 その際は、また突っ込んで頂けます様、宜しくお願い致します。^^

>>これらの分類を軸に理解するようにしてください。
>>(途中、略させて頂きます。)
>>スタック領域などは、一応、特定処理系に特化した話になります。

 分類、どうもありがとうございます。
 了解しました。今から、じっくりと勉強させて頂きます!

>>その本はCとC++の区別もあいまいになっているので、細かなところはあてにしない方がよいと思います。

 以前にも、たかぎさんはおっしゃってましたよね。
 あれから、この本を読みながら色々と調べてるうちに
 表題に、「C言語」ってうたっているのにC++が入ってたりして・・・。
 と、思う様になりました。
 今は、できるだけC言語だけでやりたいと思ってるのですが
 なかなか、区別が付きませんし余裕もありません。
 いずれは、C++も勉強してみたいと思ってます。(笑

 この本の、おさらいの項目は飛ばして
 次の章のゲーム作りに入ろうかとも思ったのですが
 お金出して買った手前もあり性格上、さらっと流す事ができず
 細かい所は当てにせず、自分で調べたり、こちらで質問させて頂いたりしてました。
 「ポインタとメモリ管理のおさらい」が、この章の最後の項目なので
 次から、いよいよDXライブラリを使ってゲームを作る章なのです。
 今まで、こちらのサイトの「ゲームプログラミングの館」にて
 勉強させて頂いてますので、楽しみにしてる章です。
 
 Dixqさんや、Dixqさんのページを批判するとかではなく ←信じて下さいっ!
 実際、この様にすごくお世話になってますし、勉強させて頂いてますので。^^

 「C言語何でも質問サイト」となっていて
 そこに「ゲームプログラミングの館」内で、DXライブラリを使ってるので
 初めてDXライブラリを使う事になりましたし、良く解らなかった私には・・・
 実際、何を使ってどの様にすれば、作りたいゲームが作れるんだろ?って
 ふらふらとネット上でさまよっていたら、たどり着いたページが
 こちらのサイトだったんです。
 何か、また日記みたいになってしまいますが。^^;

 その時に、こちらの掲示板で質問させて頂いた内容は
 (全文、詳細は覚えてなくて申し訳け御座いませんが。)
 「C++を使って、過去にあったネットゲームを再現したい。」
  の様な質問をした時に、どなたかにレス頂いたのですが
 「ここはC言語ですが、大丈夫でしょうか?」
  と、言うような内容のレスを頂きました。
 言い訳がましいですが、つまり、その時点で
 DXライブラリ == C言語
 という法則が、私の中で成り立ってしまっていた訳です。<言い訳

==============
softyaさんへ
==============

 こんばんは!
 お世話になります。
 (このページ、全て保存させて頂きました。
  ゆっくりと整理させて頂きます。(_ _))

>>ヒープ領域はmallocなどで使いますので理解しておいた方が良いでしょう。
>>静的領域は、static記憶クラスの変数も置かれますのでこれも理解しておいてください。
 
 了解しました!
 ご指導ありがとうございます。
 関数例?で、挙げて頂いた関数が、領域を理解する突破口になりそうです。
 ありがとうございます!

>>中途半端な理解だと後々混乱というかデバッグでもプログラミングでも困ることになると思いますので
>>プッラットフォーム依存限定で良いのでたかぎさんの話を全て理解しておくことをお勧めします。

 No:52586 のたかぎさんの、ご解説を含めまして、今後とも勉強させて頂きます。
 softyaさん、ご解説ありがとうございました!

================================================================================================

たかぎさんっ!

>>関数の内部で、staticもexternも付けずに宣言されたオブジェクト、関数の仮引数、式の評価結果である一時>>オブジェクトは、すべて自動記憶域期間を持ちます。
>>関数の外、またはstaticを付けて宣言されたオブジェクトは静的記憶域期間を持ちます。
>>mallocやcallocで割り付けられたオブジェクトは割付け記憶域期間を持ちます。

 申し訳け無いのですが、専門用語(漢字の部分)は、まだ良く解らないので(謝
 今後、さらに勉強させて頂きます。ありがとうございます!
 記憶領域につきましては、このご解説で(一部ですが)理解できた様な気がします。^^
 聞いた事がある(勉強した)関数の例を挙げて頂きありがとう御座いました。
 
 少しずつですが、整理できてきました。
 焦らず整理しながら、勉強していきたいと思います。

================================================================================================

記憶領域につきまして、たかぎさん、softyaさん、ご指導ご解説、どうもありがとうございました。
長々とお付き合い頂き、また貴重なお時間を割いて頂き、すみませんでした。(感謝
自分なりに整理が付きましたら、次の章に進みたいと思います。

自分が質問する(したい)趣旨が質問を考えてるうちに
いつも、何を質問したいのか解らなくなってくる馬鹿な自分です。
今後とも、ご迷惑をお掛けする事と思いますが何卒、宜しくお願い致します。

どうもありがとうございましたっ!

---誤字がありましたので、一部変更させて頂きました--- 画像