Soh*_*hir 5 dynamic-arrays solidity
所以显然我们不能在使用内存数据位置时使用动态数组。但下面的代码给了我错误:
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract A {
uint256[] public numbers;
constructor(uint256[] memory _numbers) {
for(uint256 i=0; i<_numbers.length; i++) {
numbers.push(_numbers[i]);
}
}
function get() public view returns (uint256[] memory) {
return numbers;
}
}
contract Manager {
function makeA() public returns(uint256) {
uint256[10] memory numbers;
// push is not supported for memory data location of array
numbers[0] = 10;
A a = new A(numbers); //Error: Invalid implicit conversion from uint256[10] memory to uint256[] memory requested
return a.numbers(0);
}
}
Run Code Online (Sandbox Code Playgroud)
我使用声明静态数组的语法解决了这个问题:
uint256[] memory numbers = new uint256[](5);
Run Code Online (Sandbox Code Playgroud)
虽然它解决了问题,但我仍然对为什么后者有效的概念感到困惑?我的假设是,uint256[] 和 uint256[10] 之间的类型不同。如果我错了,请纠正我,对这种行为的解释也会有所帮助。
区别如下:
首先,静态数组在定义时将分配其内存槽。
然而,每次将新元素推入动态数组时,动态数组都需要发出新的分配。
在普通的 OOP 语言中,这似乎不是什么大事,但 Solidity 需要每条指令的 Gas,这就是这种差异不容忽视的地方。