nilスマートフォン用の表示で見るnilRubyの勉強しています。この広告は、90日以上更新していないブログに表示しています。TumblrRubyには、オブジェクトを識別するためのオブジェクトIDというものがあります。同じ文字列を変数に格納してもオブジェクトIDは変わってきます。hoge」という文字列を変数strに格納し、オブジェクトIDを出力するということを10回行っています。結果は10回とも違うオブジェクトIDが出力されました。これは10回オブジェクトが生成されているということです。symbolとInteger(細かく言うとFixnum。Bignumも同様の動作をする)はオブジェクトIDが全部同じ。これは仕様でオブジェクトを複数回生成しないようになってるからみたいです。Tumblrこの前こんな記事書きました。yoskmr.hatenablog.comオブジェクトのメモリの使用量を調べるモジュールありますよという記事です。この時に謎のままにしていた以下のコードの2行目の「GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]」すが、調べたら正体がわかったので書きます。結論から言うと、「ヒープ領域に格納したRubyオブジェクトのポインタのメモリサイズ」です。Typeてのがあります。引用:http://www.is.titech.ac.jp/~sassa/lab/papers-written/08M37090-oota.pdfRubyのオブジェクト領域(図1でいえばヒープの下の領域)のオブジェクトは全てヒープ領域に値型変数にポインタとして格納されます。ヒープ領域の値型はRVALUEデータ構造という規定になっている(ガーベージコレクションやデータ型の情報も格納されている)らしい。Rubyのオブジェクトのメモリサイズ上記のことをふまえ、下のコードを確認してみましょう。80やっと本題ですね。「objspace」というモジュールを使用して、オブジェクトのメモリサイズを調べられるのですが、numもstrも、それぞれmemsize_ofメソッドだけの時と、rvalue_seize(GC::INTERNAL_CONSTANTS[:RVALUE_SIZE])をプラスした時でメモリサイズが違う。これはmemsize_ofメソッドがRuby領域のオブジェクトのメモリサイズしか出力しないからみたいです。「rvalue_size」は何者かと言うと、先ほど説明したヒープ領域で格納したオブジェクトのポインタです。【実際のメモリ】=【Rubyのオブジェクト領域でのメモリ】+【ヒープ領域でのポインタ格納のメモリ】そこで、もう一つの疑問、numオブジェクトのRubyオブジェクト領域でのメモリサイズがゼロなんだけどどういうこと?です。これは、ガーベージコレクションという動的に確保したメモリのうち、不要になった領域を開放するという機能を最適化するための例外です。いった例外かというと、「Fixnumオブジェクト,Symbolオブジェクト,true,false,nilオブジェクト」は関しては他のオブジェクトと違って扱い方を例外にしますということである。他のオブジェクトはヒープ領域にRVALUEデータ構造(ポインタ)として値型に格納されますが、例外のオブジェクトは値型には直接格納しちゃいましょうという仕様である。Fixnumオブジェクトの整数の「1」もオブジェクトであるが「1」のためにRubyオブジェクト領域にメモリを確保するのはガーベージコレクションの処理では非効率になることらしい。上記コードの整数であるnumはmemsize_ofメソッドではメモリがゼロになったのである。以下のサイト、論文を参考にしました。TumblrこんちはっすRubyの世界は全てオブジェクトである。いうことを頭に叩き込んで勉強しております。最近奇妙なものにぶつかりました。変数はオブジェクトを指すタグであって、変数は直接オブジェクトを保持しているわけではないという認識です。下のコードで、hogeメソッドにはIntegerのオブジェクトを仮引数としてわたし、fugaメソッドにはArrayのオブジェクトを仮引数としてわたしました。hogeメソッドを実行すると実引数は変化なし、fugaメソッドを実行すると実引数が変更されました。hogeメソッド実行するとhogeメソッドにいれた実引数も変更されると思ったのですが、変更されませんでした。12]※object_idについてobject_idメソッドは、レシーバのオブジェクトIDを返します。オブジェクトIDは、オブジェクトごとに固有の整数値です。レシーバが同じオブジェクトなら必ず同じオブジェクトIDになり、違うオブジェクトなら別のオブジェクトIDが返ります。Rubyリファレンスアドレスではないみたいです。オブジェクトとのことですが、「小さな整数」は特別にポインタとして扱わず直接値として扱うという仕様があるらしいのです。小さな整数ってなんですかていう話ですが、そいつの正体は「Fixnum」のことです。Fixnumの親クラスはIntegerです。Fixnumと同レベルにBignumというものがあります。Fixnumだった整数がある値を超えるとFixnumからBignumに変わります。仕様で整数の大きさでクラスが変わるみたいです。それでいつクラスが変わるのか?なんですが、調べている方がいました。Bignumsimanman.hatenablog.comつまり小さな整数を扱う場合は、直接整数を扱っているということになっているのである。小さな整数Fixnumだと値を参照しているのではなく、値を直接保持しているということになっている。これは、整数インスタンスが多すぎて、そんなに多くインスタンスつくるのはメモリ管理の手間なので、値が小さいときは特別扱いにするという仕様なんだと。ちなみに、SymbolもFixnumと同じく、特別扱いになるらしい。TumblrAOJでRubyで競技プロの問題解いてて、Rubyってメモリ消費が多いんだなーてことを実感。Rubyのオブジェクトがどれくらいメモリを消費しているのか確認できる方法調べてみました。いう数字が返ってびっくりです。これはCレベルで最適化され、オブジェクトが生成されないほげほげ...とのことです(次回調べてみます)。オブジェクトが生成されないということで、以下のようなことが起こるみたいです。(今回の本題)Rubyの変数は値渡しらしく、これは変数を他の変数に代入するときには、元変数の値が代入先の変数の値になるということ。Rubyの世界は全てオブジェクトなので、変数の値は「オブジェクトのアドレス」になるのである。オブジェクトはアドレスをもっており、そのアドレスの先に値を保持しているのである。12]仮引数を配列オブジェクトにすると、元の数字も変更された。これは、オブジェクトが直接値を保持しているのではなく、数字を保持しているアドレスを保持しているからである。fugaメソッドは配列array[]が保持しているアドレスを受け取ったことになります。それじゃ、整数はIntegerのオブジェクトじゃないの?という疑問が生まれます。TumblrRubyはすべてオブジェクトなのでクラスもオブジェクトです。クラスはClassクラスのインスタンスになります。hogeendClassクラスClassクラスにも親がいます。ancesotresメソッドを使って確認してみます。BasicObject]Classクラスで使用できるメソッドの多くはModuleクラスで定義されています。両者の違いはClassはインスタンスが生成できるClassは継承する・されることができるClassクラスで定義されているメソッドは上記2つの機能しかもっていません。:superclass]allocateメソッド:そのクラスのインスタンスとなるオブジェクトを生成しますが、initializeメソッドの呼び出しは行われません。newメソッド:そのクラスのインスタンスとなるオブジェクトを生成し、その際にinitializeメソッドが呼び出します。戻り値は新しいオブジェクト。superclassメソッド:そのクラスの親クラスを返します。戻り値はクラスオブジェクト。Tumblrvagrantでローカル環境開発を構築した。hostsファイルを編集するHostsでホスト名を編集し、vagrantを立ち上げたまま、ホスト名でログインしてみた。原因はconfigファイルにホスト名の記述がないかららしい。以下のコマンドを実行するとconfigファイルにホスト名が追加されるらしい。ホスト名が追加されていた。その後再び、ホスト名使ってログインしてみたら、ログインできた。Tumblr昔、学校でプログラミングの講義が会った時はコピペの乗り切った糞野郎です。講義中はゲームしてました(先生、すみません)。何でまた急にプログラマーを目指そうかと思ったのは、自分の手で形になるものをつくれるようになりたい、かつ、つくったもが人に触れる機会がネット上だと多いからです。あと、もくもくと作業をするのが好きだということに気がついたから。プログラミングならドットインストールローカル開発環境どうのこうのでてきて、「?」状態です。プログラミングならドットインストールこれを勉強しました。手こずりましたが、なんとかローカル開発環境を立ち上げることが出来ました。昔、学校でコマンドライン使った事あったので何とかなりましたが、全くの初心者からだとハードルは高いのかなーと思いました。ことで、次はUNIXコマンド入門勉強していきます。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。