表结构
让我们看看我们的第一个复杂数据类型,一个包含6个字段的结构:
pragma solidity ^0.4.11;
contract C {
structTuple {
uint256 a;
uint256 b;
uint256 c;
uint256 d;
uint256 e;
uint256 f;
}
Tuple t;
function C() {
t.f =0xC0FEFE;
}
}
存储中的布局与状态变量相同:
字段t.a位于0x0
字段t.b位于0x1
等等…
像以前一样,我们可以直接写入t.f而无需支付初始化费用。
我们编译:
$ solc --bin --asm --optimize c-struct-fields.sol
我们看到完全相同的组件:
tag_2:
0xc0fefe
0x5
sstore
固定长度数组
现在让我们声明一个固定长度的数组:
pragma solidity ^0.4.11;
contract C {
uint256[6] numbers;
function C() {
numbers[5] =0xC0FEFE;
}
}
由于编译器确切地知道有多少uint256(32字节),它可以简单地在存储中一个接一个地布置数组的元素,就像它对存储变量和结构一样。
在这份合同中,我们再次存储到位置0x5。
编译:
$ solc --bin --asm --optimize c-static-array.sol
集合
tag_2:
0xc0fefe
0x0
0x5
tag_4:
add
0x0
tag_5:
pop
sstore
它字节稍微长点,但你可以简化一下,你会发现实际上都是一样的。 让我们手动进一步优化:
tag_2:
0xc0fefe
// 0+5. Replace with 0x5
0x0
0x5
add
// Push then pop immediately. Useless, just remove.
0x0
pop
sstore
删除标签和伪指令,我们再次得到相同的字节码序列:
tag_2:
0xc0fefe
0x5
sstore
领取专属 10元无门槛券
私享最新 技术干货