パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

もうやらなくていい昔のコーディングテクニックあれこれ」記事へのコメント

  • malloc/freeの処理コストってどれくらいかかるんだろう。メモリがバカ高かった時代はmalloc/freeで使用量を厳密に、というのはわかるんだが、ンGB当たり前の昨今、malloc/freeの処理コストの方が高くなったりしないのかな?と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。

    ・・・malloc/free叩いとらんな、最近。

    --
    -- gonta --
    "May Macintosh be with you"
    • Re: (スコア:2, 興味深い)

      >malloc/freeの処理コストの方が高くなったりしないのかな?
      >と。「だいたい、こんくらいとっといてぇー」というようなプログラミングスタイルは無いのだろうか、と思う。

      チマチマ何回かに分けて取るより一回にまとめて取った方が相対的に安くなる
      ので、「だいたい、このくらい」でまとめて取ってから、それをアプリ内部で
      チマチマ切り刻んで使うというテクニックは昔からあったと思います。

      そしてJVMなんかだと、それを自動でやってくれるので、Javaな人にとっては
      これも「もうやらなくていい昔のコーディングテクニック」の一つですね。

      それから、OSが仮想記憶をサポートして以降は、mallocは実メモリを確保する
      わけではなくOSの管理テーブルに予約するだけなので、ちょっとくらい大きい
      領域を予約しても影響はすごく小さくなってるはずです。

      • by Anonymous Coward
        特に、常駐プログラム(そう、デーモンとかサービスとか)だと、わずかなメモリリークでも、起動して一年後にシステム停止なんてことになって、深夜呼び出し&スッゴイ怒られる、ので、未だに、メモリ管理の仕組み自体は、できるだけ自前で作りたいという人は多いかと。
        そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)でも起動時に1GByte以上のヒープサイズが必要ですとかいわれると、いくらメモリ安くなったとっていってもすこしひくなぁ。
        • >そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)

          いえいえ、お馬鹿なコードを書くとリークしていきますよ。
          使わなくなったオブジェクトに対する参照をつかんだままにしてれば
          いくらでもメモリ使用量は増えていきますから。

          スコープを外れた変数のつかんでるオブジェクトの回収とかは勝手にやってくれますが
          変数参照が生き残っていれば回収できないのです。
          プログラムグローバルなキャッシュを何も考えずに書かせると、そんなコードができるんじゃないですかね。
          ただ、まぁ、そうはいってもCに比べれば格段に問題のあるコードは書きにくくなっているでしょうね。

          • Re: (スコア:2, 参考になる)

            >>そうか、Javaだと(よほど変なことをしない限り)メモリリーク心配しなくていいのか(本当?)
            >いえいえ、お馬鹿なコードを書くとリークしていきますよ。

            「メモリリーク」という単語を、
            「ポインタ(或いは参照)を全て手放したにもかかわらず、領域の解放(free)を
             忘れたために、メモリを少しずつ食い尽くしていく現象」
            と定義するなら、Javaだと「メモリリーク」の心配はほぼありません。
            #まさに「よほど変なことをしない限り」、且つ「VMやフレームワークにバグがない限り」。
            #C言語で長期間動作するアプリを作るのが難しいのは、このような「狭義の
            #メモリリーク」の検

            • by Anonymous Coward

              >#まさに「よほど変なことをしない限り」、且つ「VMやフレームワークにバグがない限り」。
              >#C言語で長期間動作するアプリを作るのが難しいのは、このような「狭義の
              >#メモリリーク」の検出とデバッグが難しいからで、Javaではそれが発生しない
              >#ことがサーバー向けアプリに適している理由でもあります。

              これ、素直に初耳なんですけど。。
              サーバ向けアプリで知っているとすれば、銀行勘定系(COBOL)のフロントUI位なんですが、
              そんなに、サーバー向けアプリ+Javaって多い!?
              また、開発言語の選択基準がメモリの確保/解放が決め手になるなんて、どんだけ幼稚なんだと

              • by Anonymous Coward
                Cでのメモリリークというと、領域の開放し忘れじゃなくてフラグメンテーションのことだと思っていたヨ
              • by Anonymous Coward
                その認識は明らかに間違っている。
                フラグメンテーションが起きるのは結果です。
                たとえば、256KBの領域があるとき、100KB、1KBと確保して、100KBを解放すると、100KB+155KBの2つになります。後から200KBを確保できません。
                その1KBがリークしていたら、もう200KBを確保できることはありませんが、1KBが解放されれば200KBを確保できることがあるかもしれません。
                しかし、実際の問題としては必要な時に必要なメモリを確保できなければ、実行できません。

                Win32アプリなんか、ちょっとスレッドを動かすと、スレッド用スタックでメモリが分断されて、256MBを超えるメモリは1つくらいしか確保できません。実際使い物にならないけど、これをメモリリークとは言わないし、言語Cとは限らない。
              • by Anonymous Coward
                > たとえば、256KBの領域があるとき、(以下略)

                しかしJavaなどGCのある言語では、かような場合でも自動的にコンパクションを行いますから、Cよりも本質的な部分で楽でしょう。
                Cなどでは適切な順序でメモリの解放を行わないとフラグメンテーションを起こしてしてしまいますし、これが大変やっかいなバグとなることは周知のとおりです。
                (フラグメンテーションがメモリリークを引き起こす、とでも言いましょうか)

                メモリの解放忘れというのはごく初歩的なミスですから、メモリリークなどという大層な呼び名を頂いているとは思わなかったということです。
                ただのメモリの解放忘れが引き起こす現象もメモリリークと呼ぶということであれば、認識を改めます。
              • 少なくとも Visual C++ では、メモリーを確保して解放しないことを「メモリーリーク [microsoft.com]」と呼んでいます。日本語版のドキュメントでは「メモリ リークとは、割り当て済みのメモリを正しく解放できない状態を指します」と、わかったようなわからないような説明になっているので、英語版 [microsoft.com]から引用します。

                One of the most subtle and hard-to-detect bugs is the memory leak―the failure to properly deall

              • by Anonymous Coward on 2009年05月04日 23時26分 (#1559273)
                failureとあるので、(プログラマがメモリを解放しようとしたにもかかわらず)失敗した、というニュアンスでしょう。
                親コメント
              • failureとあるので、(プログラマがメモリを解放しようとしたにもかかわらず)失敗した、というニュアンスでしょう。

                failure は「何かをしようとして失敗すること」とは限りません ( [alc.co.jp])。とはいうものの、おっしゃる通り、「failure to deallocate」という英語の解釈としては「プログラマーはメモリーを解放しようとしているにもかかわらず (何らかの理由で) 解放に失敗すること」というのもありえますね。メモリーリークというのはそういう意味ではないと思っていますが、証拠を挙げるのは僕には難しいです。

                親コメント

開いた括弧は必ず閉じる -- あるプログラマー

処理中...