83780


値がはいっているのとNULLではメモリ使用量的には同じですか？

これは言語/コンパイラによってことなりますか？

[code]

    int num1 = 123;
    int num2 = NULL;
    
    Sample sample1 = new Sample();
    Sample sample2 = NULL;
    
[/code]


CC BY-SA 4.0
2021-11-22T07:07:43.740
83765
2021-11-24T04:04:07.597
2021-11-24T04:04:07.597
40856
40856
question
c++
NULLのメモリ使用量について


言語によるでしょうね。例示のコードはどの言語を想定していますか？もしC++なら`NULL`は

[code]

    #define NULL    0
    
[/code]

と定義されているだけです。`NULL`というオブジェクトがあるわけではありません。

例示のコードにはいくつかツッコミどころがありますが、つっこむのはやめておきます。


CC BY-SA 4.0
2021-11-22T08:21:13.697
83766
2021-11-22T08:21:13.697
45045
83765
answer


intの場合そのサイズは常にintのサイズ（処理系による)で決まりますので、その中に何が入っていようと、サイズが変わることはありません。  
一方Sample
sample1のようなクラスの場合、実際のデータはほかにあり、変数にはそのアドレスが入っている場合が多いです。この場合NULLであれば実体分のサイズを必要としませんのでメモリ使用量は少なくなります。これはクラスを持つ言語であればほとんど同じだと思います。  
例えばC++、C#等はそうなると思います。


CC BY-SA 4.0
2021-11-24T01:04:13.967
83779
2021-11-24T01:04:13.967
24490
83765
answer


現代コンピュータというか言語というかでは「参照」は「ポインタ」で実装されているので、以下において「参照」という用語は「ポインタ」と読み替えていただいて問題ないです。

参照に `NULL` （なり `null` なり `nil`
等）が入っている状況と、有効なインスタンス（つかオブジェクト）を指している状況とで「参照」「ポインタ」のメモリ消費量が違うことは考えにくいです。ポインタや参照は
32bit 環境においては 32bit サイズ。同様 64bit 環境では 64bit サイズであって `NULL`
が入っていようが有効なオブジェクトを指す値が入っていようが変わりません。

> NULLにしたらメモリ使用量が減る言語をなにか知っていますでしょうか？

gc 系の言語 ([java](/questions/tagged/java "'java' のタグが付いた質問を表示") /
[c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示") 等)
においては、参照されている（＝ポインタによって指されている）先のオブジェクトの参照回数が（参照に `NULL` を格納することによって）０になったがゆえに
gc
の対象となって回収された（＝メモリ使用量が減った）ということはありますが、質問の状況とは意味が全く異なるので混同してはいけません。この場合でも「参照のメモリ消費量」は減っていません。「参照先がなくなった」だけです。

そして現代 [c#](/questions/tagged/c%23 "'c#' のタグが付いた質問を表示")
等では下記のようなコードを書いても意味がないです。コンパイラとランタイムが十分賢いので `null` を代入するコードをわざわざ手書きする必要はありません。

[code]

    void SomeFunction() {
        MyClass m = new MyClass();
        // m を使う処理
        m = null; // プログラマの意図としてここで gc してほしいと書いたつもり
        // m を使わない処理
    }
    
[/code]

ソースコードの文脈上 `m` を使わなくなった時点で `m` の指す先の `MyClass` オブジェクトは（たとえひとつの `{ ... }`
の内側にあったとしても） gc 対象となります。つまり `m = null;` は冗長です。


CC BY-SA 4.0
2021-11-24T01:10:13.297
83780
2021-11-24T01:10:13.297
8589
83765
answer