Storan berbanding Memori
Lokasi data
Storan berbanding Memori ialah pelajaran Asas Pembangunan Web3 & DApp percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Asas Pembangunan Web3 & DApp, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Asas Pembangunan Web3 & DApp merangkumi sejumlah 4 pelajaran.
Mengapa Lokasi Data Penting
Dalam Solidity, jenis rujukan mesti menentukan lokasi data. Tiga lokasi tersebut ialah storage, memory dan calldata.
Pemilihan yang tepat mempengaruhi kekekalan, kebolehubahan dan, yang paling penting, kos gas.
Storage
Storage ialah keadaan kekal kontrak pada rantaian. Pemboleh ubah keadaan berada di sini dan penulisan ke storage ialah operasi yang paling mahal.
Data dalam storage kekal antara transaksi.
<code>contract Bank {
uint256 public total; // lives in storage forever
function add(uint256 v) public {
total += v; // writes to storage (expensive)
}
}</code>Memory
Memory ialah ruang kerja sementara yang wujud hanya semasa panggilan fungsi. Ia jauh lebih murah daripada storage dan dikosongkan apabila fungsi kembali.
Gunakan memory untuk pengiraan perantaraan dan data yang tidak perlu dikekalkan.
<code>function build() public pure returns (uint[] memory) {
uint[] memory temp = new uint[](3);
temp[0] = 1;
temp[1] = 2;
return temp; // discarded after call
}</code>Calldata
Calldata ialah lokasi baca sahaja yang tidak boleh diubah, yang menyimpan argumen fungsi untuk panggilan external. Ini pilihan yang paling murah kerana tiada salinan dibuat.
Gunakannya untuk parameter fungsi yang hanya perlu dibaca.
<code>function sum(uint[] calldata values) external pure returns (uint total) {
for (uint i = 0; i < values.length; i++) {
total += values[i];
}
}</code>Penuding Storage kepada Keadaan
Dalam fungsi, pemboleh ubah tempatan storage ialah penuding kepada keadaan sedia ada. Mengubahnya akan mengubah storage sebenar kontrak.
<code>struct User { uint balance; }
mapping(address => User) users;
function credit() public {
User storage u = users[msg.sender];
u.balance += 100; // updates real state
}</code>Salinan Memory bagi Keadaan
Jika sebaliknya anda memuatkan keadaan ke dalam pemboleh ubah memory, anda mendapat salinan bebas. Perubahan pada salinan itu TIDAK mengemas kini storage kontrak.
Ini merupakan punca pepijat yang biasa bagi pemula.
<code>function noEffect() public view returns (uint) {
User memory u = users[msg.sender];
u.balance += 100; // only the copy changes
return u.balance; // storage is untouched
}</code>Perbandingan Kos Gas
Kedudukan kos, daripada paling murah hingga paling mahal:
- calldata - argumen luaran baca sahaja, tiada salinan
- memory - sementara, disalin ke RAM
- storage - kekal pada rantaian, sangat mahal untuk ditulis
Penulisan storage baharu (sifar kepada bukan sifar) ialah salah satu operasi EVM yang paling mahal.
Utamakan calldata untuk external
Bagi fungsi external yang parameter tatasusunan atau structnya hanya dibaca, gunakan calldata dan bukannya memory untuk mengelakkan salinan yang tidak diperlukan serta menjimatkan gas.
<code>// Cheaper: no copy is made
function process(bytes calldata data) external {
// read data directly
}</code>Tempat Nilai Lalai Digunakan
Pemboleh ubah keadaan sentiasa storage. Parameter fungsi dan pemboleh ubah tempatan jenis rujukan mesti mengisytiharkan lokasi secara jelas. Jenis nilai dan ahli pemetaan menggunakan peraturan storage secara automatik.
Pemetaan tempatan mesti sentiasa storage - ia tidak boleh berada dalam memory.
<code>// mapping locals must be storage
function f() public {
// mapping(...) memory m; // ERROR
}</code>Menyimpan Bacaan Storage dalam Cache
Pengoptimuman gas: jika anda membaca pemboleh ubah storage yang sama beberapa kali, salinkannya sekali ke dalam pemboleh ubah tempatan memory. Setiap bacaan storage (SLOAD) menggunakan gas.
<code>function loop() public view returns (uint) {
uint cached = total; // one SLOAD
uint acc;
for (uint i = 0; i < 10; i++) {
acc += cached; // reads memory, cheap
}
return acc;
}</code>Memulangkan Memory
Fungsi yang membina dan memulangkan tatasusunan atau struct baharu menggunakan memory untuk nilai yang dipulangkan, kerana storage tidak boleh dipulangkan mengikut nilai dan calldata hanya untuk input.
<code>function pair(uint a, uint b) public pure returns (uint[] memory) {
uint[] memory out = new uint[](2);
out[0] = a;
out[1] = b;
return out;
}</code>Semakan Pantas
Uji pemahaman anda tentang lokasi data.
Imbas Kembali
Anda telah mempelajari cara lokasi data Solidity berfungsi:
- storage - kekal, pada rantaian, paling mahal untuk ditulis
- memory - ruang kerja sementara, disalin, dikosongkan selepas panggilan
- calldata - argumen luaran baca sahaja, paling murah, tiada salinan
Gunakan rujukan storage untuk mengubah keadaan, memory untuk kerja sementara dan calldata untuk input luaran baca sahaja bagi menjimatkan gas.
Pelajari Asas Pembangunan Web3 & DApp dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 29
- Pelajaran
- 105
Soalan Lazim
Adakah pelajaran “Storan berbanding Memori” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Asas Pembangunan Web3 & DApp, termasuk “Storan berbanding Memori”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Asas Pembangunan Web3 & DApp merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Storan berbanding Memori”?
Lokasi data Anda berlatih Asas Pembangunan Web3 & DApp menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Asas Pembangunan Web3 & DApp?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Asas Pembangunan Web3 & DApp di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.
Berapa lamakah pelajaran “Storan berbanding Memori” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Asas Pembangunan Web3 & DApp ini?
Ya. Setiap pelajaran Asas Pembangunan Web3 & DApp menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Jenis Nilai
- Jenis Rujukan
- Storan berbanding Memori
- Pemalar dan Tidak Berubah