ゆとり理系のgdgdブログ

.com.comです。 ここでは自分の日々の思いや出来事、知識などを紹介していくブログです。

11<< 12345678910111213141516171819202122232425262728293031 >>01 管理画面

プロフィール

.com.com
Since 10/04/10

主な活動内容

  • YouTube実況者(.com.com名義)
  • YouTube実況者wiki管理人(2代目)
  • Visitors

    あなたは人目の訪問者です。 (Since 10/09/09 19:15)

    活動場所リンク

    YouTube 実況メイン
    Stickam 生配信メイン
    Twitter
    Twitter(チャンネル用)
    Justin.tv
    Ustream

    ブロとも申請フォーム

    ブログリンク

    ※★は相互リンクです。
    ※●はYouTube実況者以外のオススメブログです。(●がなければ実況者です。)
    ※*はFC2ブログでないブログ(Amebloなど)です。
    ※◆はこちらをご覧ください。
    ※2012年以降更新がないブログは最下部にまとめて畳んでいます。

    Channel Info

    チャンネルの最新情報はこちら!

    スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    ポインタのおなはし その4 ~コンピューターはメモリをこう使う~

    Q. 目が見えないので、駅までの道案内をお願いします!ちなみに歩幅は一歩50cmなので!(▼∀▼)
    A. 知るか、ボケェ!



    前回途中でご紹介した、「苦しんで覚えるC言語」、結構参考になります。
    個人的には、include疑似命令の説明がすごい助かりました。
    以前Cを教わった際、#include <stdio.h>をおまじないだと言われていたため、この意味がこのサイトですごく分かりました。
    しまいには、「studioからuを抜かした」という珍妙な覚え方ではなく、「std(システムっぽい名前)+io(入出力のI/O)」という覚え方までするようになっています。

    今回も予めこのサイトで予習しています。あることないこと書いちゃってるから、多少は信ぴょう性を持たせたいのが理由です。本当に情けないです。



    さて、今回はコンピューターとメモリの関係を見ていきます。
    「苦しんで覚えるC言語」の第15章第1節「メモリの仕組み」では、要約すれば「メモリは2ビットの超巨大な1列ロッカー」と表現しています。
    もちろんその通りなのですが、ここではこの中の「超巨大な1列ロッカー」という表現を拝借します。(この部分はそのまま拝借しています。)
    超巨大な1列ロッカー。
    コンピューターが実際にソフトを扱う場合、コンピューターはこのロッカーを使うことになります。
    以前メモリは作業デスクみたいなものと説明しましたが、コンピューターはこの作業デスクを超巨大な1列ロッカーとみなして扱っています。
    何か二転三転して分かりにくい?ごめんなさい。その都度そうでもしないと分かりにくいと思うので。
    でもこの分かりにくさが、ポインタの概念やメモリリーク発生の分かりにくさに繋がるんです。
    どういうことかを説明する前に、コンピューターはメモリをどう扱っているのか、これを簡単にまとめます。

    1. コンピューターは、メモリを超巨大な1列ロッカーとして扱っている。
    2. コンピューターは、変数名を覚える気がない。
    3. コンピューターは、ある場所から何番目にあると数えるのが得意。
    4. コンピューターは、何かの値をメモリに入れる際、好き勝手に入れる癖がある。


    1番目は説明したのでいいでしょう。
    2番目と3番目について。
    私たち人間は物を名前で覚えます。例えば、本棚にたくさんの本を入れていたとします。この中で読みたい本を探すには、本の名前をもとにして探していきます。
    しかし、コンピューターは何番目に置いてあるのかという風にして覚えます。このメリットですが、覚える際に必要な知識が少ないこと、確実に探せること、この2点にあります。
    例えば人間の場合、本棚の中身が150か国から集めた本だったら、少なくとも150か国の言語を覚える必要があります。しかし、コンピューターは数字を覚えるだけでどの本でも確実に取り出すことが出来ます。
    コンピューターは本を数字で覚える?!
    4番目について。
    要は、「とにかく空いているところに突っ込め!」的なノリです。
    ロッカーを使う訳ですから、まず既に使っているところには入れられないですよね。そして、コンピューターの仕事はとんでもなく多いです。
    モタモタしていたら人間に怒られてしまいます。だから、空いているところが見つかり次第さっさか入れていくでもしないといけません。



    さて、本棚のイラストで
    1. 数字が0から始まっている
    2. ABCDというアルファベットが出ている

    点に気付いた方もいるかもしれません。
    2番目から先に言うと、これは16進数で数えていること、そしてスペース的に10とか2ケタの数字が入らないのが原因です。どうでもいいですね。
    1番目ですが、コンピューターはある基準の位置と、そこから何番目にあるのかという覚え方をします。この「何番目」にあたる部分をオフセット(offset)と言います。

    このオフセットという考え方ですが、実は皆さんも結構使っています。
    それが道案内。
    ここから2つ目の信号を右に~とかそんな感じで使っていますよね。あれと同じです。



    さて、本題。ポインタとはどういう意味があるのか。
    友人のS君は「ポインタはショートカットみたいなもの」と言っていました。
    最初、自分もこれで分かりやすかったのでそう考えていました。
    でも、このシリーズを書くにあたって、考えてみたらショートカットというと少し曖昧な気がしてなりませんでした。

    そこで、以下の例で考えてみます。
    これから紹介する文は、自分の家への道案内です。
    (※基本的に一部を除けば、忠実に.com.comの自宅への道案内になっています。)
    __の__に出て、__にある____を渡ります。そして、渡った先にある__を左手に___の中を進みます。しばらく_分ほど歩きます。すると、左手に____、右手に___が見えるので、そこを_に曲がります。そのまま進むと__に______が見えます。その___の家が自宅です。
    さて、これで僕の家に行けますね!

    ……冗談です。敢えて空欄ばっかりにしてみました。
    この空欄ですが、ポインタとオフセットにあたるものです。
    では、オフセットの箇所だけ埋めてみます。
    __の北口に出て、右手にある____を渡ります。そして、渡った先にある__を左手に___の中を進みます。しばらく10分ほど歩きます。すると、左手に____、右手に___が見えるので、そこをに曲がります。そのまま進むと右手に______が見えます。その向かいの家が自宅です。
    さあ、今度は大丈夫ですね!

    ……ごめんなさい、冗談ですって。
    K駅北口に出て、右手にある横断歩道を渡ります。そして、渡った先にある靴屋左手商店街の中を進みます。しばらく10分ほど歩きます。すると、左手に小児科医、右手に小学校が見えるので、そこをに曲がります。そのまま進むと右手白いアパートが見えます。その向かいの家が自宅です。
    K駅って何駅さ?!というツッコミは厳禁です。

    皆さん、人に道案内をする際、どうしていますか?
    目印を使いつつ教えていますよね。
    これは、分かりやすいことと無駄な情報を入れる必要がないことの2つのメリットがあります。
    ポインタは言わば物を探す目印みたいなものなのです。
    そして、ポインタを使うメリットは、この中でも無駄な情報を入れる必要がないことにあります。
    一見すると値と目印を2つ覚えることになるので逆に無駄になると考えそうですが、この「値」が構造体(オブジェクト)になると事情は大きく変わってメリットが増えます。これについては次回ご説明します。
    スポンサーサイト

    ポインタのおなはし その3 ~コンピューターの性格を知ろう~

    Q. 先生、パソコンが言うことを聞いてくれません。きっと僕との相性が悪いんですよ。
    A. じゃあ、根気よく仲良くなる努力をしなさい。

    タイトルではコンピューターと書いてますが、このシリーズではパソコンというにはちょっと語弊があるのが理由です。
    というのは、パソコンはPersonal Computer、つまり和訳すれば「個人用のコンピューター」です。
    ポインタの概念を扱う上で、Public(公共)もPrivate(私的)も関係ありません。
    でも、本文中は敢えて「パソコン」を使います。略語で書きやすいからです。(完全に私的な理由)

    このQ&Aの話ですが、パソコンでトラブルが起きると、トラブルを起こしたパソコンを使っていた人が言いそうな言葉ですよね。きっと相性が悪いんだって。
    ラジオでサントリーのBOSSのCM(宇宙人ジョーンズ)のサポートセンター編でも出てたなぁ……。
    でも、ポインタの概念を理解するうえではこちらから歩み寄らないといけないんです。自分はポインタを知る上で、すごく痛感した部分です。(一人勝手にだけど。)

    誰だったか、「コンピューターは善悪を理解できない」と言っていた人がいました。
    それくらいコンピューターは堅物です。
    どれくらい堅物なのでしょうか。
    緑色がその性格です。(若干脚色を加えています。)



    1. 何かを言われないと何もしない
    要は、プログラムを書いて、それをコンピューターに渡さないと何もしてくれないのです。
    融通か利かないな、なんて言わないであげてください。コンピューターってそんな子なんですから。

    2. 言われたことは何が何でも必ずやる
    言わないと何もしませんが、言われたことは必ずします。
    まさに人間の鑑です。人間はこの性格に惹かれたんですね。

    3. ちょっとでも曖昧だと「分からない」と言って何もしない
    詳しい話は苦C、もとい「苦しんで覚えるC言語」の第0部第1章「プログラムとは何か」の第3項「明確な意味」を読んでいただけると分かるかと思います。



    実は、この3つで全てです。
    単純な割にはこの3つの性格のせいでとんでもない堅物になっちゃったんです。誰がこんな性格にしちゃったんでしょうか。
    こんな性格なので、人間はコンピューターに対してイライラすることもしょっちゅうあります。
    以下がその例です。



    1. 善悪を判断できない
    先程述べた話です。
    例えば、コンピューターウィルスをばらまくプログラムをコンピューターは渡しちゃえば、コンピューターはその目的を聞いたり疑ったりせずに平気で行っちゃいます。
    そんな子なんです。

    2. ファイルを保存した場所が変わっても、そのことを覚えない
    急にレベルが下がったとか次元が下がったとか言わないで!(><;)
    例えば、ファイルをどこかに動かしたとします。でも、ソフトで元の場所を開こうとすると、コンピューターは馬鹿正直にそこを探します。結局見つからず「無いよー!」って言ってふてくされて投げ出します。「例外を投げる」とちょっとかけたつもり。
    そんな子なんです。

    3. もうやらなくてもいいことを無限にやろうとする
    プログラムの無限ループの話。
    要は、例えば10回やって欲しいのに、コンピューターからしたら全く終わらない命令を渡しちゃったとします。すると、コンピューターは「じゃあ永遠にこれやってるね」とひねくれて無限にやろうとします。
    そんな子なんです。

    4. 言わないと文章とか絵とか音楽とかを保存してくれない
    普通のプログラムは、終了の際にファイルを保存していないと「保存していないけどいいの?」という趣旨のメッセージを出します。でもこれってコンピューターは、相当なおせっかい焼きだと見ています。
    相当簡単なプログラムを作ると、人間に確認せず、勝手に消しちゃうことも普通にあります。
    そんな子なんです。

    5. 自分に都合の悪いものだけさっさと消しちゃう
    プログラムを色々いじると、突然落ちることがあります。
    結構堅物なので、かなり頑張るのかなと思いきや、コンピューターはちゃっかり者だったりもします。
    先程の性格を踏まえると、どれにもあたらないような気がしますよね?
    でもこれは、コンピューターは既に「危なくなったら勝手に消しちゃってもいいからな!」という命令を植え付けられているためです。自己防衛も言われて動いているんです。
    そんな子なんです。

    6. ブルースクリーン
    挙句の果てには、自分も何度も見てきたこのブルースクリーンを見せつけて座り込みます。
    ちなみにブルースクリーンですが、これも結局命令です。「こういうことになったらブルースクリーンを出してもう何もするな!」と言われているんです。
    そんな子なんです。



    さて、本シリーズの最終テーマにもなっているメモリリークですが、これは上記の例でいえば、4番と5番にあたります。
    実は最初5番の文、「自分に都合の悪いものさっさと消しちゃう」としたのですが、直しました。

    自分に都合の悪いメモリリークを起こすプログラムは勝手に消しちゃいます。そうしないと、メモリが無くなっててんてこ舞いになってしまうからです。そして、メモリリークは不要なメモリを解放しないことが原因です。
    もし、不要なメモリだとコンピューターが分かれば、勝手に解放します。これは5番のいい部分です。
    でも、コンピューターはちょっとでも曖昧だと何もしません。この変数はもう使わないと思っていても、コンピューターは「もしかしてまだ使うんじゃないかな?」と思って後生大事にとっておくんです。
    だから、人間が「これはもう使わないメモリだから解放しなさい」と言わなければ、後生大事にとっておくんです。

    これがメモリリークの原因です。
    面倒くさいでしょうが、そこは根気強く付き合っていかなくてはいけないのです。
    その2の冒頭のQ&Aを思い出してください。最初の2つの選択肢は「机を買ってあげる」「仕事を手伝う」でした。
    そんな風にしてコンピューターをいたわってあげないと、ポインタを活用したプログラムは書けないのです。
    コンピューターは相当頑固な人間だと思ってもいいでしょう。相当頑固な人間と付き合うのはかなり骨が折れます。
    ですが、そこは根気で分かってあげるのです。そうしたら、コンピューターはあなたにとって最高のパートナーになれるはずです。


    続きを読む »

    ポインタのおなはし その2 ~メモリって何なの?~

    Q. 先生、机が狭いです……。
    A. 机を買ってあげる→3ページへ
       仕事を手伝う→4ページへ
       無視する→5ページへ
       仕事を増やす→6ページへ


    このQ&A意味あるのって?大いに意味あります。

    このところ、昔と比べた時、メモリの容量の多さにはビックリさせられます。
    自分が扱ってたパソコンですが、初代(家族共有)は256MBです。この頃のOSはXPです。
    あれから10年。今のメモリはGB単位ですよね。4GBとか8GBとか。今この記事を書くのに使っている4代目のパソコンはメモリ4GB。
    比較するために昔の記憶を引っ張ってきましたが、本当にすごいものです。
    で、最近の悩みですが、ちょくちょくメモリが不足していますというエラーが出ます。
    色々開いてるからしょうがないよね。

    実はこのメモリ、ざっくばらんに言えばソフトを動かすうえで必要になります。
    さっきもエラーが出たので、いろいろ閉じて、今は使用量を約2GB弱にしています。
    (さっきSkypeとかTerapadとか勝手に開いていたSQL Serverとかも閉じたら約1.8GBになりました。)
    この量ですが、Windowsならタスクマネージャで確認できます。Ctrl+Shift+ESCを押せば表示できます。
    「パフォーマンス」タブにある「メモリ」です。(この図で言えば赤枠の箇所。)
    タスクマネージャの「パフォーマンス」タブを開くと出てくる、「メモリ」の部分。

    この「メモリ」は、イメージ的に言えばパソコンが作業をするためのスペースにあたります。
    パソコンの作業用デスク、それがメモリ。
    パソコンも、そのデスクでメモを置いていたり、電話を置いていたり、電卓を置いていたり、色々やっているわけです。
    で、扱っているソフトが増える(仕事が増える)と、机が手狭になります。これがさっき言ったエラーが出る理由です。
    仕事(ソフト)が増えたら作業スペースが減る。これがメモリ不足。

    これの解決方法は主に2つ。
    扱っているソフトを減らす(仕事を減らす)か、メモリを増やす(机を広げる)の2つです。
    簡単にできるのは前者です。自分はさっきSkypeとか……と言っていましたが、それがまさに扱っているソフトを減らすということです。
    仕事(ソフト)を減らして作業スペースを増やす。
    一方もう一つの「メモリを増やす」ですが、これはパソコンを自作したりする場合で出てくる、メモリをパソコンに取り付けるという方法です。お金と知識が必要です。
    机を広げると作業スペースは増える。
    参考までに、仮想メモリを作るという方法もあります。これは、ハードディスクにメモリみたいなものを作るということです。これはシステムから行えますが、知識が必要なうえに仮想メモリは普通のメモリよりも何十倍も遅いので、余程のことがない限り作る必要はありません。
    (例えて言うなら、棚を作業スペースとして確保するようなもの。)

    良く、「メモリが足りないからいらないファイルを消そう」と言って勘違いする人がいるのですが、これはメモリではなくハードディスクの空き領域が正しい表現になります。
    もし、ファイルが保存できないというのであれば、まずハードディスクの空き領域を確認しましょう。
    とは言っても、2000年代までのスペックのPCでない限り、ハードディスクの空き領域が足りないことはないはずです。(余程のことがない限りは……。)
    これについては分かる人ならすぐ分かる話です。

    ここで、もし空き領域が十分にあるなら、今度はメモリを疑いましょう。
    というのは、保存の際は一度メモリに記憶してからハードディスクに保存するからです。つまり、保存するにあたってもメモリは必ず使います。
    これは、基本的にはさっき言った2通りの方法で回避できます。

    ポインタのおなはし その1 ~はじめに~

    最近C++を始めててんてこ舞いです。
    久々にポインタを使うことになったから頭がはじけそうだったよ!
    ということで、備忘録も兼ねて書いておきます。



    Q. 「ポインタのおはなし」じゃなくて?
    A. うるせー馬鹿!

    というのはさておき、このタイトルにします。
    このタイトルですが、以前Cの勉強をしていて、友人に説明する際の資料を作った際、タイトルを打ち間違えたのが原因で出来たタイトルです。
    案外気付きにくそうな割に、声に出す(黙読でもいいですが)と変なインパクトがあると思っているのは自分だけなので、こういうタイトルで通しています。



    Q. これって何のおはなしなの?
    A. C言語の系統で出てくるポインタに関するおはなし。以上。

    ポインタの概念って、プログラミングをやっていて一度は躓く分野だと思うんです。
    かくなる自分も、最初は躓きました。
    プログラミングがほとんどできない友人がいたため、これを説明するための資料を作って自分なりに理解しようとしたこともあって、若干は分かってきたつもりです。

    でも、久々にポインタを扱うことになって、とんでもない落とし穴を見過ごしていたのです。
    それは、どうしてポインタの概念が必要なのか。
    率直に言えば、ガベージコレクションを自動でやってくれるJavaを主に使っていたせいで、この考えを完全に見落としていたのです。
    これを深く考えて納得できれば、ポインタに対する抵抗はかなり軽減できると思うんです。

    しかし、残念ながら実際にプログラムを始めてしまうと、その考えは二の次になってしまいます。
    実際に自分の場合、プログラムを作っていてメモリリークという問題に気付きましたが、それがポインタと大きな繋がりがあるということには、最初全く思いもよらなかったのです。
    この繋がりを理解したとき、ポインタの奥深さと重要性に気付き、今まで感じていたポインタに対するもやもやとした「何となく分かるけど使いこなせない感」が払拭できたと感じます。

    そこで、この「ポインタのおなはし」では、ポインタの意味を、実際にプログラムを作っていて遭遇するメモリリークと繋げることで、ポインタをスッキリ理解してもらうということをコンセプトに執筆しています。
    要は、抽象よりも具体ということを意識しています。

    なお、ここで扱うのはVC++(Visual C++)ですが、あくまで概念的な部分が中心になるので、言語に応じて適切なキーワードに読み替えてください。
    一例として、ここではnewとdeleteになっていますが、例えばCではmallocとfree等に対応します。
    さらに、Visual C++では、deleteの代わりにDeleteObjectという関数を使うこともありますが、基本的には同じです。使いやすいものを選んでください。
    なにせ、個人的にはCの記憶を完全に掘り起こすのは大変なので、最近習いたてのVC++を前提として話を進めます。この点はご了承ください。

    また、話を簡略化したりするために、あることないこといろいろ書いています。
    そのため、内容の信ぴょう性に関しては保証致しかねます。この点もご了承ください。
    さらに、説明目的で、自作の低レベルな絵がバンバン出てきます。この点もご了承ください。(やっつけで作っているのが理由。)

    最後に、ポインタの概念を知る上で、理解するきっかけを作ってくれた友人のK君、同じく彼に教えるために「ポインタはショートカットのようなもの」という分かりやすい説明をしていたS君、理解するうえで参考にさせていただいた各種ウェブサイトやブログに、この場を借りて御礼申し上げます。

     | ホーム | 

    検索フォーム

    記事クイックジャンプ

    QRコード

    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。