91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Solidity數據存儲位置是在哪

發布時間:2021-12-07 15:45:22 來源:億速云 閱讀:297 作者:iii 欄目:互聯網科技

本篇內容介紹了“Solidity數據存儲位置是在哪”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

數據位置(Data location)

在系列第一篇,我們提到 Solidity 類型分為兩類: 值類型(Value Type)引用類型(Reference Types), 前面我們已經介紹完了值類型,接下來會介紹引用類型。

引用類型是一個復雜類型,占用的空間通常超過256位, 拷貝時開銷很大,因此我們需要考慮將它們存儲在什么位置,是memory(內存中,數據不是永久存在)還是storage(永久存儲在區塊鏈中) 所有的復雜類型如數組(arrays)和結構體(struct)有一個額外的屬性:數據的存儲位置(data location)。可為memorystorage

根據上下文的不同,大多數時候數據位置有默認值,也通過指定關鍵字storage和memory修改它。

函數參數(包含返回的參數)默認是memory。 局部復雜類型變量(local variables)和 狀態變量(state variables) 默認是storage

局部變量:局部作用域(越過作用域即不可被訪問,等待被回收)的變量,如函數內的變量。狀態變量:合約內聲明的公有變量

還有一個存儲位置是:calldata,用來存儲函數參數,是只讀的,不會永久存儲的一個數據位置。外部函數的參數(不包括返回參數)被強制指定為calldata。效果與memory差不多。

數據位置指定非常重要,因為他們影響著賦值行為。 在memory和storage之間或與狀態變量之間相互賦值,總是會創建一個完全獨立的拷貝。 而將一個storage的狀態變量,賦值給一個storage的局部變量,是通過引用傳遞。所以對于局部變量的修改,同時修改關聯的狀態變量。 另一方面,將一個memory的引用類型賦值給另一個memory的引用,不會創建拷貝(即:memory之間是引用傳遞)。

  1. 注意:不能將memory賦值給局部變量。

  2. 對于值類型,總是會進行拷貝。

下面看一段代碼:

pragma solidity ^0.4.0;

contract C {
    uint[] x; //  x的存儲位置是storage

    // memoryArray的存儲位置是 memory
    function f(uint[] memoryArray) public {
        x = memoryArray;    // 從 memory 復制到 storage
        var y = x;          // storage 引用傳遞局部變量y(y 是一個 storage 引用)
        y[7];               // 返回第8個元素
        y.length = 2;       // x同樣會被修改
        delete x;           // y同樣會被修改

        // 錯誤, 不能將memory賦值給局部變量
        // y = memoryArray;  

        // 錯誤,不能通過引用銷毀storage
        // delete y;        

        g(x);               // 引用傳遞, g可以改變x的內容
        h(x);               // 拷貝到memory, h無法改變x的內容
    }

    function g(uint[] storage storageArray) internal {}
    function h(uint[] memoryArray) public {}
}

總結

強制的數據位置(Forced data location)
  • 外部函數(External function)的參數(不包括返回參數)強制為:calldata

  • 狀態變量(State variables)強制為: storage

默認數據位置(Default data location)
  • 函數參數及返回參數:memory

  • 復雜類型的局部變量:storage

深入分析

storage 存儲結構是在合約創建的時候就確定好了的,它取決于合約所聲明狀態變量。但是內容可以被(交易)調用改變。

Solidity 稱這個為狀態改變,這也是合約級變量稱為狀態變量的原因。也可以更好的理解為什么狀態變量都是storage存儲。

memory 只能用于函數內部,memory 聲明用來告知EVM在運行時創建一塊(固定大小)內存區域給變量使用。

storage 在區塊鏈中是用key/value的形式存儲,而memory則表現為字節數組

關于棧(stack)

EVM是一個基于棧的語言,棧實際是在內存(memory)的一個數據結構,每個棧元素占為256位,棧最大長度為1024。 值類型的局部變量是存儲在棧上。

不同存儲的消耗(gas消耗)

  • storage 會永久保存合約狀態變量,開銷最大

  • memory 僅保存臨時變量,函數調用之后釋放,開銷很小

  • stack 保存很小的局部變量,幾乎免費使用,但有數量限制。

“Solidity數據存儲位置是在哪”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阆中市| 尚义县| 凤凰县| 伊金霍洛旗| 垣曲县| 札达县| 景洪市| 高唐县| 廊坊市| 桃园市| 临颍县| 永吉县| 安康市| 永安市| 伽师县| 蒙城县| 康乐县| 霍林郭勒市| 收藏| 科尔| 巴彦淖尔市| 通城县| 瓮安县| 米泉市| 潼关县| 错那县| 措勤县| 双牌县| 滕州市| 苍南县| 屏东县| 砚山县| 资兴市| 新邵县| 阿拉善盟| 苗栗市| 柯坪县| 桂林市| 长岛县| 长武县| 宿松县|