Solidity 变量数据位置
规则1 – 状态变量
状态变量总是存储在存储区中。
pragma solidity ^0.5.0;
contract DataLocation {
// storage
uint stateVariable;
uint[] stateArray;
}
此外,不能显式地标记状态变量的位置。
pragma solidity ^0.5.0;
contract DataLocation {
uint storage stateVariable; // 错误
uint[] memory stateArray; // 错误
}
规则2 – 函数参数与返回值
函数参数包括返回参数都存储在内存中。
pragma solidity ^0.5.0;
contract DataLocation {
// storage
uint stateVariable;
uint[] stateArray;
function calculate(uint num1, uint num2) public pure returns (uint result) {
return num1 + num2
}
}
此处,函数参数
uint num1 与
uint num2,返回值
uint result 都存储在内存中。
规则3 – 局部变量
值类型的局部变量存储在内存中。但是,对于引用类型,需要显式地指定数据位置。
pragma solidity ^0.5.0;
contract Locations {
/* 此处都是状态变量 */
// 存储在storage中
bool flag;
uint number;
address account;
function doSomething() public {
/* 此处都是局部变量 */
// 值类型
// 所以它们被存储在内存中
bool flag2;
uint number2;
address account2;
// 引用类型,需要显示指定数据位置,此处指定为内存
uint[] memory localArray;
}
}
不能显式覆盖具有值类型的局部变量。
function doSomething() public {
/* 此处都是局部变量 */
// 值类型
bool memory flag2; // 错误
uint Storage number2; // 错误
address account2;
}
规则4 – 外部函数的参数
外部函数的参数(不包括返回参数)存储在Calldata中。