solidityノート(7)——記憶領域memory storage stack——2021.5.12


solidityノート(7)——記憶領域memory storage stack

  • 一丶memory:
  • 二丶storage:
  • 三丶stack:
  • 四丶記憶領域:
  • 五丶注意事項:
  • 四丶上一篇:solidity笔记(6)——modifier用法
  • 五丶次篇:solidity笔记(8)——pure用法
  • 一丶memory:


    メモリmemoryは、データを一時保存するために使用されます.格納された内容は、外部関数を含む関数が呼び出されたときに消去されるため、使用コストが比較的小さい.

    二丶storage:


    storageを格納し、契約宣言のすべての変数を格納します.仮想機会は、契約ごとに独立したストレージstorage領域を画定し、関数が相互に呼び出されるときに永続的に存在するため、使用コストが非常に大きい.

    三丶stack:


    スタックstackは、小型のローカル変数を格納するために使用されます.利用はほぼ無料ですが、容量は限られています.

    四丶記憶領域:


    異なるデータ型の変数には、それぞれのデフォルトの保管場所があります.
    ステータス変数は常にストレージstorageに関数パラメータがデフォルトでメモリmemoryに格納される構造、配列、またはマッピングタイプのローカル変数が格納され、デフォルトではストレージstorageに格納される構造、配列、マッピングタイプ以外のローカル変数がスタックに格納されます.

    五丶注意事項:


    一般的なエラーは、ローカル変数を宣言し、メモリmemoryに作成されると考えられますが、ストレージstorageに作成されます.
    ///  
    
    pragma solidity ^0.4.0;
    
    contract C {
         
        uint someVariable;
        uint[] data;
    
        function f() public {
         
            uint[] x;
            x.push(2);
            data = x;
        }
    }
    

    ローカル変数xのデータ型はuint[]storageですが、ストレージstorageは動的に割り当てられていないため、使用前にステータス変数で値を割り当てる必要があります.したがって、x自体はstorageを格納する空間を割り当てられず、代わりにstorageに既存の変数を格納する別名としてのみ使用される.実際には、コンパイラはxをストレージstorageポインタとして解析し、デフォルトではストレージスロットstorage slot 0にポインタを指します.これにより、someVariable(ストレージスロットstorage slot 0が格納されている)がx.push(2)によって変更されます.
    注意:この例では、2つの契約変数someVariableとdataが、2つのストレージスロットstorage slot、すなわちストレージスロットstorage slot 0とストレージスロットstorage slot 1に予め割り当てられます.上記のプログラムでは、ローカル変数xは、変数someVariableが保存されているストレージスロットstorage slot 0へのポインタになります.
    ///  
    pragma solidity ^0.4.0;
    
    contract C {
         
        uint someVariable;
        uint[] data;
    
        function f() public {
         
            uint[] x = data;
            x.push(2);
        }
    }
    

    下一篇:solidity笔记(6)——modifier用法


    solidityノート(6)——modifier使い方

    下一篇:solidity笔记(8)——pure用法


    solidityノート(8)——pure使い方