Overhead dan pertimbangan lain apa yang ada saat menggunakan struct vs kelas?

16

C pada embedded system secara tradisional menggunakan struct untuk menyimpan data terstruktur.

Arduino membawa C ++ ke tabel, jadi kita bisa menggunakan kelas sebagai gantinya.

Katakanlah kita memiliki dua struktur data yang berbeda yang dapat dianggap sangat mirip:

typedef struct 
{
    int valueOne;
    int valueTwo;
    int valueThree;
} value_t;

dan:

class Value
{
    public:
        int valueOne;
        int valueTwo;
        int valueThree;
}

Dalam hal memori, apa bedanya ini?

Saya masih melihat teknik struct sedang digunakan - mengapa ini?

Cybergibbons
sumber
5
jika saya ingat C + + saya dengan benar tidak ada perbedaan antara structdan classselain visibilitas default
ratchet freak
4
Saya akan berasumsi structs digunakan terutama karena sebagian besar perangkat keras tertanam dikodekan dalam C, jadi siapa pun yang menghabiskan banyak waktu menulis kode untuk MCU kecil mungkin tahu C lebih baik daripada C ++, dan secara otomatis meraih idiom C sebelum idiom C ++. Ini masalah kinerja programmer .
Connor Wolf

Jawaban:

12

Seperti yang diambil dari jawaban yang diterima dari Kapan Anda harus menggunakan kelas vs struct di C ++?

Satu-satunya perbedaan antara kelas dan struct dalam C ++ adalah bahwa struct memiliki anggota publik standar dan basis dan kelas memiliki anggota dan basis privat default. Kelas dan struct dapat memiliki campuran anggota publik dan pribadi, dapat menggunakan warisan, dan dapat memiliki fungsi anggota.

Saya akan merekomendasikan menggunakan struct sebagai struktur data lama-polos tanpa fitur seperti kelas, dan menggunakan kelas sebagai struktur data agregat dengan data pribadi dan fungsi anggota.

Dari segi memori, pengubah akses tidak membuat perbedaan dan mengingat batasan memori dari Arduino, orang cenderung menggunakan kelas dengan hierarki yang kompleks, tetapi tetap memilih POD struct.

orang aneh
sumber
5

Tidak seperti C, turunan dari structdalam C ++ adalah objek dengan cara yang persis sama dengan turunan dari a class. Dari sudut pandang kode yang dikompilasi, mereka identik. Penggunaan memori, perataan, waktu akses, dll. Persis sama (yaitu tidak ada overhead).

Dari sudut pandang programmer, ada perbedaan yang sangat kecil. Anggota yang structmemiliki visibilitas publik secara default, sedangkan anggota yang classmemiliki visibilitas pribadi secara default. Jika tidak, semua fitur bahasa berfungsi dengan baik pada keduanya, seperti konstruktor / destruktor, pewarisan, polimorfisme, templat, dan overloading operator. Anda bahkan dapat memperoleh a structdari class, dan sebaliknya.

Terlepas dari kesamaannya, cukup umum untuk melihat orang-orang dengan sengaja menggunakan a structdalam C ++ untuk struktur yang sangat sederhana, misalnya di mana itu hanya terdiri dari beberapa anggota data, tetapi tidak ada fungsi. A classakan digunakan untuk hal yang lebih kompleks. Ini murni masalah konvensi atau preferensi pribadi, dan dapat digunakan sebagai indikasi halus dari kompleksitas struktur yang dimaksudkan.

Peter Bloomfield
sumber
4

Seperti yang ditunjukkan oleh jawaban lain, kinerja Anda yang khusus structdan classtidak dapat dibedakan (Ada sedikit perbedaan dalam cakupan nama jenis, karena cara Anda mendefinisikan struct Anda). Delineasi dalam C ++ bukan antara structdan class, tetapi antara tipe yang POD (data lama polos) dan tipe yang tidak, seperti dijelaskan dalam diskusi ini .

microtherion
sumber
3

Dalam hal memori, apa bedanya ini?

Tidak ada Struktur dan kelas adalah hal yang sama, hanya berbeda dalam tingkat perlindungan, dan instantiasi baik menciptakan 'objek'.

masih melihat teknik struct sedang digunakan - mengapa ini?

Kurang mengetik jika Anda tidak berusaha menyembunyikan anggota data.

Lumpur
sumber
2

Catat itu

typedef struct { ... } Foo;

sudah usang dalam C ++ dan sebaiknya Anda gunakan saja

struct Foo { ... };

Tidak terlalu jelas dalam jawaban tetapi efek lain dari struct adalah warisan publik secara default vs warisan pribadi secara default dengan kelas.

Seperti yang disebutkan oleh orang lain, menggunakan struct umumnya merupakan konvensi untuk jenis POD.

Juga secara teknis 'struct vs object' harus 'struct vs class' (karena instantiating struct atau kelas masih memberikan objek).

codah
sumber
Objek pertanyaan> kelas yang diedit.
Cybergibbons