Bir yapıyı sınıfa karşı kullanırken hangi genel giderler ve diğer düşünceler var?


17

Gömülü sistemlerde C geleneksel olarak yapılandırılmış verileri tutmak için yapıları kullanır.

Arduino C ++ 'ı masaya getirir, böylece sınıfları kullanabiliriz.

Diyelim ki çok benzer sayılabilecek iki farklı veri yapımız var:

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

ve:

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

Bellek açısından, bu ne fark eder?

Yapı tekniğinin çok yoğun olarak kullanıldığını görüyorum - bu neden?


5
C ++'ımı doğru bir şekilde hatırlıyorsam , varsayılan görünürlük arasında structve classyanında fark yoktur
cırcır ucube

4
Ben varsayılabilir structçünkü ler öncelikle kullanılan büyük bir küçük MCU'lar için zaman kod yazma harcıyor herkes muhtemelen C ++ deyimler önce C deyimler için ulaşır otomatik ardından çok daha iyi C bilir C ++ ve böylece, gömülü donanım çoğunluğu C kodlanmıştır. Bu bir programcı performans sorunu.
Connor Wolf

Yanıtlar:


13

Kabul edilen cevaptan alındığı gibi C ++ 'da bir sınıfı vs bir yapıyı ne zaman kullanmalısınız?

Bir sınıf ve C ++ içindeki bir yapı arasındaki tek fark, yapıların varsayılan genel üyelere ve tabanlara ve sınıfların varsayılan özel üyelere ve tabanlara sahip olmasıdır. Hem sınıflar hem de yapılar, kamu ve özel üyelerin bir karışımına sahip olabilir, kalıtım kullanabilir ve üye işlevlerine sahip olabilir.

Herhangi bir sınıf benzeri özelliği olmayan yapıları düz-eski-veri yapıları olarak kullanmanızı ve sınıfları özel veri ve üye işlevlerine sahip toplu veri yapıları olarak kullanmanızı öneririm.

Bellek değiştirici erişim değiştirici fark etmez ve Arduino'nun bellek kısıtlamaları göz önüne alındığında, insanların karmaşık hiyerarşileri olan sınıfları kullanma olasılığı daha düşüktür, ancak yine de POD yapılarını tercih ederler.


7

C'den farklı olarak, structC ++ 'da a örneği, a örneğiyle tam olarak aynı nesnedir class. Derlenmiş kodun bakış açısından, bunlar aynıdır. Bellek kullanımı, hizalama, erişim süreleri vb. Tamamen aynıdır (yani ek yük yoktur).

Programcının bakış açısından, çok küçük bir fark vardır. Bir üyeleri structbir üyesi ise, varsayılan olarak kamu görünürlüğe sahip classvarsayılan olarak gizli görünürlüğe sahip. Aksi takdirde, yapıcılar / yıkıcılar, kalıtım, polimorfizm, şablonlar ve operatör aşırı yüklenmesi gibi tüm dil özellikleri her ikisinde de aynı şekilde çalışır. Hatta a ' structdan classve tam tersi de türetebilirsiniz .

Benzerliğe rağmen, insanların kasten structC ++ 'da çok basit yapılar için kullandıklarını görmek oldukça yaygındır , örneğin sadece birkaç veri üyesinden oluşur, ancak işlevler yoktur. A classdaha karmaşık bir şey için kullanılır. Bu sadece bir kongre veya kişisel tercih meselesidir ve yapının amaçlanan karmaşıklığının ince bir göstergesi olarak kullanılabilir.


4

Diğer cevapların işaret ettiği gibi, sizin özelliğiniz structve classayırt edilemez performans açısından akıllıca (Yapınızı tanımlama şekliniz nedeniyle tür adlarının kapsamlarında küçük farklılıklar vardır). C ++ 'da tanımlama, structve classarasında değil, bu tartışmada açıklandığı gibi POD (düz eski veriler) olan ve olmayan türler arasındadır .


3

Bellek açısından, bu ne fark eder?

Yok. Yapılar ve sınıflar aynı şeydir, sadece koruma seviyelerinde farklılık gösterir ve örnekleme ya bir 'nesne' oluşturur.

hala yoğun olarak kullanılan yapı tekniğini görüyorum - bu neden?

Veri üyelerini saklamaya çalışmıyorsanız daha az yazabilirsiniz.


2

Bunu not et

typedef struct { ... } Foo;

C ++ 'da kullanılmıyor ve sadece

struct Foo { ... };

Cevaplarda çok açık değil, ancak yapıların diğer etkisi varsayılan olarak sınıflarla özel mirasa karşı varsayılan olarak kamusal mirastır.

Başkaları tarafından da belirtildiği gibi, yapıyı kullanmak genellikle POD türleri için bir kuraldır.

Ayrıca teknik olarak 'struct vs object', 'struct vs class' olmalıdır (bir yapı veya sınıfın başlatılması hala bir nesne verir).


Düzenlenen soru nesnesi-> sınıfı.
Cybergibbons
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.