Saya telah pemrograman untuk beberapa waktu sekarang tetapi saya baru di Arduino dan Pemrograman AVR. Pertanyaan utama yang saya miliki tentang pemrograman pengendali-mikro ini adalah apakah ada perbedaan besar dalam merancang kode di Object Orientated Classes vs pemrograman inline yang lebih tradisional yang saya lihat dalam banyak contoh?
Dengan kata lain di dunia Arduino / AVR Controllers apakah ada penghematan dengan Memory dan Performance menggunakan kelas atau sebaliknya?
Katakanlah misalnya kita memiliki Kelas:
class SomeClass(){
private:
int x;
int y;
public:
void foo();
void bar();
}
SomeClass thisClass;
thisClass.foo();
thisClass.bar();
Apakah akan ada peningkatan kinerja atau memori merancang program dengan cara yang lebih inline seperti:
int x;
int y;
void foo(){ /*** Do something ***/};
void bar(){ /*** Do more stuff ***/};
Saya mencoba melakukan beberapa pencarian di Stack Exchange dan Google tetapi tidak dapat menemukan jawaban yang cukup saya cari hal terdekat yang dapat saya temukan adalah Pertanyaan Stack Exchange ini.
Alasan saya bertanya tentang ini adalah saya memiliki proyek yang perlu seringan mungkin dan saya tidak jelas bagaimana saya harus merancang program saya di lingkungan ini.
Edit
Terima kasih atas jawabannya, ini telah menjelaskan banyak hal. Ada satu hal yang tidak saya jelaskan.
Katakanlah Anda memiliki kelas yang Anda rancang yang menggunakan u8glib sebagai berikut:
class UserInterface{
private:
U8GLIB_ST7920_128X64 Display;
public:
UserInterface();
}
Bagaimana cara Anda menggunakan "Memori Dinamis" seperti:
UserInterface::UserInterface(){
UserInterface::Display = U8GLIB_ST7920_128X64(LCD_E_PIN, LCD_RW_PIN, LCD_RS_PIN, U8G_PIN_NONE);
}
sumber
UserInterface::UserInterface() : Display(LCD_E_PIN, LCD_RW_PIN, LCD_RS_PIN, U8G_PIN_NONE) { ... }
. Parameter konstruktor Tampilan yang diperlukan harus diteruskan ke konstruktor UserInterface.Alasan Anda tidak dapat menemukan jawabannya adalah karena jawabannya adalah Ya dan Tidak.
Untuk hal-hal kelas dasar - mendefinisikan kelas Anda dengan metode dll dan instantiating objek dari itu - ada sedikit perbedaan dalam hasil akhir dibandingkan dengan "vanilla" C. Optimalisasi kompiler sangat baik sekarang bahwa kinerjanya sama saja. Ya, mungkin ada sedikit peningkatan dalam penggunaan memori karena Anda melewati pointer tambahan dengan setiap pemanggilan metode (bukan yang
foo(int x)
Anda milikifoo(MyClass *this, int x)
) tapi itu sangat kecil sehingga tidak terlihat.Perbedaan besar datang ketika Anda mulai bermain dengan polimorfisme dan topik lanjutan lainnya. Ketika mulai melakukan program-program kompleks ini kompiler tidak selalu tidak dapat mengetahui fungsi mana yang diperlukan dan mana yang tidak, dan itu tidak dapat memotong fungsi yang tidak digunakan ( "pengumpulan sampah" ). Jadi Anda mungkin berakhir dengan kode yang lebih besar.
Itu tidak berarti kode lebih lambat, hanya potongan kode yang berkeliaran yang tidak pernah melakukan apa pun.
Yang lebih penting adalah mengelola memori dinamis Anda lebih baik daripada yang biasa Anda lakukan. Karena ada sejumlah kecil memori, tumpukan sangat kecil, dan akibatnya mudah terfragmentasi. Penciptaan dinamis dan penghancuran objek (
new myClass
,delete myClassObject
, dll) sangat buruk. Objek kelas benar-benar perlu didefinisikan secara statis (dalam lingkup global adalah yang paling umum) atau sementara dialokasikan pada stack (instance lokal). Kalau tidak, Anda meminta masalah - dan yang pertama Anda ketahui adalah hal-hal aneh terjadi (tidak ada laporan kesalahan atau pengecualian, Anda lihat ...).sumber