MEMO

個人の備忘録的に学習の記録を綴っていきます。(いつまで続くか...!)

【第10回】変数やメモリとはなんぞ?

(執筆+記事として投稿:63分くらい)

基礎的な知識をみにつける会

(書籍内:P42~51)

 

メモリとは何ぞやなどなど

 

「C++では2進数の数字をプログラムに書けない」
16進数は書ける


「変数とはメモリというchar型の配列に間借りをしておかれているに過ぎない」
classのprivate変数であったとしても、ポインタを指定して直接アクセスすれば改変も可能である。
┗この、起こりえるということが肝心。


C++におけるポインタの*演算子とは、ポインタ変数を添え字にしてメモリという配列にアクセスすること」
実際、ポインタは単なる整数に過ぎない。


「ポインタは値が0の時には何も指さないものとするという決まりがある」
0ポインタと呼ばれ、メモリという配列において0番目は使ってはいけないというルールがあるため。
deleteした時などにポインタに0を入れるのは、この性質をデバグに使うためである。
deleteをしてもポインタには何かしらの値が入っているため、それを使えばどこかにアクセスできてしまうため危険。


「0は状況によって、ポインタとしても整数としても解釈される場合がある」
A(int)という整数を取るコンストラクタとA(B*)という別の型のポインタから作るコンストラクタがあったりすると、この仕様のために困ることになる。
A(0)とかくと、どっちか判断できずコンパイラがエラーをはく。


「型が違おうとも、全て中身はメモリという配列の添え字にしかすぎない。しかし、型によって次の要素までの距離が違う」
char型は1バイトだが、int型は4バイトなど。


「newにはメモリから空いている場所を探してきて添え字をポインタに入れる機能と、コンストラクタをその場所に対して呼ぶ機能の2機能がある」
逆にdeleteはデストラクタを読んだ後にメモリを開放する機能のことである。
newの際に空いている場所を探すのは、中で働いているメモリ管理プログラムである。
適当な添え字で無理やりアクセスすれば、newをしなくても動いてしまうということが起こりうる。


C#Javaには勝手にメモリを開放する機能があるがC++にはない」
これは、メモリの開放を自動でやってくれるかどうかの違いだが、意識しなくても勝手に開放してくれる分、その自動開放プログラムの影響で処理が止まってしまう事もある。(人間に認知できるような止まり方ではないが)
C++を使用するのは、だいたい処理速度を気にする時なので、アナログにメモリ開放していく必要があっても、処理速度に影響がでないことを優先するのである。
※自動でメモリ開放してくれる機能:ガベージコレクション