Это очень простая техника, которую многие из нас, возможно, используют, не подозревая о ее газоэффективности.
Рассмотрим следующие контракты:
contract Inc1{
uint[] public arr = [0,1,2,3,4,5,6,7,8,9,10];
uint total;
function something() external {
uint sum;
uint[] memory _arr = arr;
for (uint i; i < _arr.length; i += 1) {
sum += _arr[i];
}
total = sum;
}
}
contract Inc2{
uint[] public arr = [0,1,2,3,4,5,6,7,8,9,10];
uint total;
function something() external {
uint sum;
uint[] memory _arr = arr;
for (uint i; i < _arr.length; i++) {
sum += _arr[i];
}
total = sum;
}
}
Оба контракта имеют функцию something
, которая итерирует массив для суммирования всех элементов. Но разница заключается в стиле инкремента циклов. Inc1 имеет i +=1
, а Inc2 имеет i++
.
Inc1
Inc2