Solidity

函式變數在哪裡創建?

  • October 2, 2020
function element() public  returns (uint) {
 uint test = 20;
 return test;
}

test變數將在哪裡創建?在記憶體或堆棧中?

有趣的是來自測試程序集,我可以看到它不在記憶體中。我只是好奇為什麼?

這是我在網上找到的。在此處輸入圖像描述

此描述區分儲存和非儲存。

它似乎使用“記憶體”來指代非儲存。

這可能不是最好的詞選擇,因為使用關鍵字memory是為了指示給定變數是在堆上分配的。

換句話說,您有 3 個數據部分:

  1. 儲存,一致的數據所在的位置
  2. 堆棧,原始類型的不一致數據所在的位置
  3. 堆,非原始類型的不一致數據所在的位置

在哪裡:

  • “一致數據”是執行完成後仍然有效的數據
  • “原始類型”是除數組和結構之外的所有變數類型

您發現的描述只是將所有不一致的數據,無論其實際類型如何,都稱為駐留在記憶體中而不是儲存中的數據。


更新:

是否在堆棧或堆上分配變數的決定實際上取決於該變數是否具有恆定長度(在編譯期間已知)。

例如,以下變數具有恆定長度:

uint256[2] a;

Foo b;

// Where:
struct Foo {
   uint256 x;
   uint256[2] y;
}

雖然以下變數的長度是非恆定的:

uint256[] a;

Foo b;

// Where:
struct Foo {
   uint256 x;
   uint256[] y;
}

需要使用memory來告訴編譯器給定變數不在儲存中,因為編譯器storage預設情況下假定某些類型(如數組和結構)。

引用自:https://ethereum.stackexchange.com/questions/87988