「メモリア」を含む日記 RSS

はてなキーワード: メモリアとは

2012-06-15

http://anond.hatelabo.jp/20120614121920

ポインタ、参照(リファレンス)、束縛(バインディング)、それぞれ似てるけど同様に語ると混乱の元ではないかと。

 

ポインタメモリアドレスに型情報をくっつけたもの。加減算できる点が特徴で、それはメモリアドレス概念由来だろう。

変数というメモリ上の記憶域を指すフィジカルに近い概念で、配列運用(*p++で回すとか)、引数の参照渡し(コピー抑止、複数戻り値の実現)、メモリのもの管理malloc)あたりで、基本手作業による最適化のための仕組みという側面が近いと思う。

 

perlだと、変数はやっぱり記憶域ではあるけれど概念として一段抽象化されていて、メモリという連続した領域じゃなく独立した領域の集合となっているから、リファレンスの加減算はなし。

また、配列も単なるメモリの並びからより抽象化してリストもできたから、配列運用や複数戻り値リストがあるのでリファレンスに頼ることはなくなる。

ただ、オブジェクト概念があって、オブジェクトオブジェクトとして入れる変数は用意せずリファレンスとすることで、文法上の変数の型を増やさない、コピー時のコンストラクタの問題を回避するなどのほか、オブジェクト概念を援用して無名関数無名変数ファイルハンドルなども変数引数として扱えるようにした。

 

で、pythonはもう一段推し進めて、今までの数値や文字、配列オブジェクトとみなし、変数はすべてオブジェクトを指し示すもので、記憶域は変数としてあるのではなくオブジェクトとしてあり、変数リファレンスという特別なものがあるのではなくなり、変数記憶域をもっていて値が代入されるものではなく、既にあるオブジェクト変数名という名前(ラベル)を付けて束縛する行為とされる。

見方を変えると変数はすべてにおいてリファレンスで、代入とは値そのものの代入でなく値へのリファレンスの代入で、引数も参照渡しであるが、引数に代入したところでリファレンスが変わるだけで元の値が変わるわけではなく、しかし他の演算などでは自動的にデリファレンスされており、単純な数値や文字列など、自身を変更する機構を持たない(できない)ものにとっては実質的に今までとの違いはないに等しい。隠ぺいといえば隠ぺいか

java, javascript, rubyもおおむねこの考え方でよかったと思う。

ただ、phpは若干両者が混じったところがあって微妙なところがある。

 

参考

2012-06-14

じゃあこれまでの仕事で何にポインタを使ったか書いてこうぜ

http://anond.hatelabo.jp/20120614111008

俺はバイナリファイルの解析に使った。

ファイル先頭部のヘッダ部分のデータの並びを定義したクラスポインタに、ファイル先頭部のメモリアドレスキャスト代入した。

以後ポインタを介して、オブジェクトのメンバとしてデータを読み出すことができる。

ヘッダ以降に繰り返し配置されている、データ部分へのアクセスも同様。

2012-06-12

http://anond.hatelabo.jp/20120612010211

ポインタの説明したがる人って、なんで無駄比喩を持ちだしてくるんだろう。分かりにくいだけだと思うんだけど。

メモリ区画にはメモリアドレスという名前がついてて、ポインタメモリアドレス型の変数だよ、って感じでいいじゃん。

2011-01-15

http://anond.hatelabo.jp/20110115212704

残念ながら、その読書履歴だと、ここで言う「原理」には辿り着いてないと思います。挙げられた本はどれも計算に関する抽象概念からさらに上の、アーキテクチャ言語化する部分に関してです。それらも原理と言えば原理なのですが、そこからスタートしてもC言語でのプログラムは書けるようになりません (Rとかなら書けるかもですが)。

ここで言う『原理』すなわち、なぜ char x[sizeof(int)]; がダメなのか、という理解につながる原理は、「レジスタ」「ALU(CPUの中の計算ユニット)」「バス」「メモリ」といった原理ですメモリアクセスやヒープ・スタックの使い方、アセンブラといったような話です

なんで言語約束事の上っ面を覚えるのが難しいか、というと、「原理」を理解していないからなんです原理を理解せずに約束事だけ覚えたって使えません。曖昧で良いので、プログラムを動かしているときにどのようにメモリが構成されどのようにアクセスされるのかを知る努力をして下さい。その上でC言語をよく見ると、いかCPUアーキテクチャに近い所で記述されているのかがわかるようになると思います(*)。

それだけで、目の前の箱がどう動いているかの理解度が劇的に上がる筈です

*: 理解したつもりになるだけですが、現実コンパイラCPUも、そのさらに7歩ぐらい先に行っています。ですが、この領域は進めば進むほど泥沼なので、「あ、Cって高級アセンブラなんだな」という所で実用上は十分だと思います。てか、偉そうなこと言っている私(某大学博士課程在籍、要は増田現実逃避中のダメ学生)も、そこから先はちゃんと理解していません…。

2011-01-14

http://anond.hatelabo.jp/20110114230925

そこまでやるなら

"\xNN\xXX\xXX\xXX\xXX"[i%15]

でよかろ。-'F' する意味が無い。¥x00 の形式で非ASCIIも指定できるんだから

はいえ、いまどきの パイプラインガシガシのコンピューターだとキャッシュがあるとはいえ、メモリアクセスで、レイテンシとレジスタのみでifジャンプとどっちが速いかは、やってみないとわからんなぁ。

2010-07-28

http://anond.hatelabo.jp/20100728222811

JAVAで書いてもいいが、システムが巨大という意味にはJavaVMの移植とかLinuxカーネルパッチという意味まで含まれているので

CだろうとC++だろうと使うことになるのは変わらんし

今時、list なんぞ を1から手書きするくらいならSTLリスト使ってメモリアロケーターだけ書き換えるわw

ログイン ユーザー登録
ようこそ ゲスト さん