在智能合约开发中,动态数组通常会消耗较多的 gas, 而使用定长数组可以有效降低 gas 成本。
动态数组的赋值需要进行复制,删除操作需要移位,这些都会增加 gas 消耗。例如:
uint[] public arr;
function f() public {
for(uint i = 0; i < 100; i++) {
arr.push(i);
}
}
相比之下,定长数组长度固定,赋值直接通过索引修改,删除值后不需要移位。例如:
uint[100] public arr;
function f() public {
for(uint i = 0; i < 100; i++) {
arr[i] = i;
}
}
因此,在长度已知或者上限可预估的情况下,使用定长数组可以减少 gas 消耗。需要注意的是,定长数组不能增加长度,如果预计可能需要扩容,仍需使用动态数组。
在智能合约优化中使用定长数组可以明显减少 gas 成本,但需要考量业务场景是否真的需要固定长度,灵活运用动态数组和定长数组的优劣可以实现最优的 gas 使用效果。