Perbedaan antara class dan struct sederhana namun penting: class adalah tipe referensi; struct adalah tipe nilai. Perbedaan ini menentukan tata letak memori, cara penyalinan, dan karakteristik performa pada runtime. Memahami kapan memilih salah satunya membantu menulis kode yang dapat diprediksi, lebih cepat, dan lebih mudah dipelihara di berbagai bahasa seperti C#, C++, dan Swift.
January 29, 2026 (6mo ago) — last updated May 26, 2026 (2mo ago)
Classes vs Structs: Panduan Performa untuk Pengembang
Perbedaan classes vs structs dan kapan memilihnya di C#, C++, dan Swift untuk performa, memori, dan kode bersih.
← Back to blog
Classes vs Structs: Panduan Performa untuk Pengembang
Ringkasan: Ungkap perbedaan inti antara classes dan structs serta kapan memilihnya di C#, C++, dan Swift untuk kode bersih dan performa tinggi.
Introduction
Perbedaan antara class dan struct sederhana namun penting: class adalah tipe referensi; struct adalah tipe nilai. Perbedaan ini menentukan tata letak memori, cara penyalinan, dan karakteristik performa pada runtime. Memahami kapan memilih salah satunya membantu menulis kode yang dapat diprediksi, lebih cepat, dan lebih mudah dipelihara di berbagai bahasa seperti C#, C++, dan Swift.
Perbedaan Fundamental
Saat Anda membuat instance class, variabel menyimpan referensi ke objek di heap. Menyalin variabel itu menyalin referensi; beberapa referensi dapat menunjuk ke objek yang sama sehingga perubahan melalui satu referensi terlihat di tempat lain. Semantik referensi ini menjadikan class pilihan tepat untuk entitas yang memiliki identitas dan state bersama.1
Struct merepresentasikan data itu sendiri. Menyalin struct membuat duplikat independen—sering disimpan di stack atau inline di dalam array—sehingga memodifikasi salinan tak memengaruhi aslinya. Ini membuat struct ideal untuk nilai sederhana yang immutable atau semantik tanpa identitas.1
Untuk pembahasan lebih lanjut tentang enkapsulasi dan desain objek, lihat panduan kami tentang enkapsulasi berorientasi objek: https://cleancodeguy.com/blog/object-oriented-encapsulation.

Perbandingan Singkat: Tipe Referensi vs Tipe Nilai
| Karakteristik | Class (Tipe Referensi) | Struct (Tipe Nilai) |
|---|---|---|
| Lokasi memori | Heap; objek direferensikan melalui pointer. | Stack atau inline; variabel berisi data. |
| Assignment | Menyalin referensi, bukan objek. | Menyalin seluruh nilai. |
| Lifetime | Diatur oleh garbage collector atau pengelolaan manual. | Dihapus saat keluar scope atau disimpan inline. |
| Identitas vs nilai | Memiliki identitas; beberapa referensi sama. | Merepresentasikan nilai; kesetaraan umumnya berdasarkan data. |
Gunakan class ketika Anda membutuhkan identitas bersama; gunakan struct ketika Anda membutuhkan nilai mandiri yang mudah disalin tanpa efek samping.
Dasar ini memandu trade-off performa—alokasi heap vs stack, lokalitas cache, dan tekanan garbage collection—yang dibahas di bagian berikut.
Bagaimana Alokasi Memori Mempengaruhi Performa
Tata letak memori memengaruhi efisiensi CPU, throughput, dan latensi. Mengakses data lewat class biasanya melibatkan indireksi: pointer di stack menunjuk ke data di heap. Indireksi tambahan ini menambah biaya dan dapat merusak lokalitas cache. Struct yang disimpan langsung pada variabel sering menghindari indireksi dan memungkinkan tata letak memori yang rapat, meningkatkan cache hit dan throughput.5

Biaya Garbage Collection
Objek di heap tunduk pada garbage collection. Siklus GC dapat menghentikan eksekusi sementara dan menambah latensi pada sistem real-time atau throughput tinggi. Alokasi berulang untuk object yang berumur pendek meningkatkan tekanan GC dan overhead CPU; menggunakan tipe nilai untuk objek kecil dan sementara mengurangi churn heap serta pekerjaan GC.3
Alokasi heap menambah potensi overhead GC. Struct menghindari overhead tersebut ketika tetap sebagai tipe nilai dan tidak terkena boxing.3
Lokalitas Cache dan Throughput
CPU modern sangat bergantung pada cache. Tata letak berurutan—misalnya array of structs—meningkatkan cache hit dan throughput. Alokasi terpisah untuk setiap instance class menyebarkan data di memori, meningkatkan cache miss dan menurunkan performa pada loop ketat atau pipeline data.5
Perangkap Boxing
Boxing terjadi ketika tipe nilai dikonversi menjadi tipe referensi (misalnya saat ditempatkan ke koleksi yang mengharapkan objek). Boxing mengalokasikan objek di heap dan menyalin nilai ke dalamnya, meniadakan keuntungan performa struct dan menambah beban GC. Menghindari boxing adalah prinsip penting saat menggunakan tipe nilai secara efisien.4
Perbedaan Antar Bahasa: C#, C++, dan Swift
Setiap bahasa menerapkan konvensi dan batasan berbeda. Mengetahui aturan bahasa mencegah penerapan pola yang tidak cocok.

C#: Model Referensi vs Nilai yang Jelas
Di C#, class = tipe referensi dan struct = tipe nilai. Gunakan class untuk entitas beridentitas (misalnya Customer atau DatabaseConnection) dan struct untuk nilai kecil yang immutable (misalnya Point atau Color). Menjaga struct kecil dan immutable membantu menghindari bug halus dan overhead penyalinan yang tak terduga.1
Kesalahan umum adalah membuat struct besar atau mutable; keduanya dapat menyebabkan regresi performa atau perilaku tak terduga. Ikuti pedoman membuat struct kecil dan immutable saat mengoptimalkan kode di C#.1
C++: Konvensi dan Fleksibilitas
Di C++, perbedaan sintaks antara struct dan class hanya akses default. Keduanya bisa dialokasikan di stack atau heap, memiliki method, dan mendukung pewarisan. Konvensi umum adalah memakai struct untuk agregat data polos dan class untuk objek dengan enkapsulasi dan manajemen resource (RAII).
Fleksibilitas ini berarti pengembang C++ harus mengandalkan konvensi desain dan pilihan alokasi, bukan perbedaan bahasa yang memaksa perilaku nilai/referensi.
Swift: Mengutamakan Nilai
Swift menganjurkan penggunaan struct untuk banyak tipe kustom. Struct di Swift mendukung method, extension, dan kepatuhan pada protokol—menjadikannya pilihan kuat dan aman. Pilih class hanya bila semantik referensi, identitas, atau interoperabilitas Objective‑C diperlukan.2
Pendekatan bernilai ini mendorong immutability dan memudahkan pemikiran tentang aliran data, terutama pada kode konkuren.
Kapan Memilih Struct untuk Efisiensi Maksimal
Struct ideal untuk bundel data kecil dan immutable yang identitasnya didefinisikan oleh nilainya. Contoh khas:
- Data geometris: Point2D atau RGBColor
- Nilai finansial: Money (amount + currency)
- DTO kecil yang diproses pada pipeline throughput tinggi
Pedoman praktis ukuran memberi rentang kira‑kira 16–32 byte: jika field struct muat dalam rentang itu, biaya penyalinan biasanya moderat dan lebih murah daripada alokasi heap. Jika struct lebih besar atau mutable, class kemungkinan pilihan lebih baik.5

Immutability dan Aturan Ukuran
- Pilih struct yang immutable: buat nilai sekali dan kembalikan instance baru untuk perubahan.
- Jaga struct tetap kecil: penyalinan struct besar berulang sering lebih mahal daripada melewatkan referensi.
Prinsip ini membantu menghindari bug dari salinan mutable dan jebakan performa karena penyalinan berlebihan atau boxing.
Kesalahan Umum dan Refaktor
Dua masalah sering muncul: struct mutable dan boxing berlebih.
Struct mutable menyebabkan perilaku mengejutkan karena perubahan hanya memengaruhi salinan. Refaktor struct mutable menjadi immutable yang mengembalikan instance baru saat state berubah.
Boxing terjadi implisit di banyak API dan koleksi; identifikasi hotspot boxing dan hapusnya untuk mempertahankan keuntungan performa struct.
Contoh: Refaktor Mutable Point menjadi Immutable Struct (C#)
// PITFALL: Mutable struct public struct MutablePoint { public int X { get; set; } public int Y { get; set; }
public void Move(int dx, int dy)
{
X += dx;
Y += dy;
}
}
// REFACTOR: Immutable struct public readonly struct ImmutablePoint { public int X { get; } public int Y { get; }
public ImmutablePoint(int x, int y)
{
X = x;
Y = y;
}
public ImmutablePoint MovedBy(int dx, int dy)
{
return new ImmutablePoint(X + dx, Y + dy);
}
}
Refaktor ini menegaskan intent dan menghilangkan korupsi state yang tidak disengaja. Untuk praktik clean‑coding lebih lanjut, lihat panduan kami: https://cleancodeguy.com/blog/clean-coding-principles.
3 Pertanyaan Jawab Singkat (Q&A)
Q: Kapan saya harus memilih struct daripada class?
Pilih struct bila tipe Anda kecil, immutable, dan merepresentasikan nilai bukan identitas—misalnya Point, Color, atau DTO singkat.1
Q: Apa jebakan performa yang harus diwaspadai?
Hindari struct besar, struct mutable, dan boxing ke heap—ketiganya bisa meniadakan keuntungan tipe nilai dan merusak performa serta prediktabilitas memori.45
Q: Bagaimana perbedaan bahasa memengaruhi pilihan desain?
Ikuti idiom bahasa: C# jelas membedakan referensi vs nilai; C++ mengandalkan konvensi; Swift memfavor nilai sebagai default. Pelajari aturan platform sebelum menerapkan pola lintas‑bahasa.12
Di Clean Code Guy, kami membantu tim menerapkan prinsip ini ke basis kode nyata. Codebase Cleanups dan AI‑Ready Refactors kami membuat perangkat lunak lebih cepat, lebih aman, dan lebih mudah dipelihara. Kunjungi https://cleancode.com untuk mempelajari lebih lanjut.
AI menulis kode.Anda membuatnya bertahan.
Di era akselerasi AI, kode bersih bukan hanya praktik yang baik — ini adalah perbedaan antara sistem yang berkembang dan codebase yang runtuh di bawah beratnya sendiri.