Có những chi phí nào và những cân nhắc khác khi sử dụng struct vs class?


15

Theo truyền thống, C trên các hệ thống nhúng thường sử dụng các cấu trúc để giữ dữ liệu có cấu trúc.

Arduino mang C ++ lên bàn, vì vậy chúng ta có thể sử dụng các lớp thay thế.

Hãy nói rằng chúng ta có hai cấu trúc dữ liệu khác nhau có thể được coi là rất giống nhau:

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

và:

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

Về bộ nhớ, điều này sẽ tạo ra sự khác biệt gì?

Tôi vẫn thấy kỹ thuật struct đang được sử dụng rất nhiều - tại sao lại như vậy?


5
Nếu tôi nhớ lại C ++ của mình một cách chính xác thì không có sự khác biệt giữa structclassbên cạnh khả năng hiển thị mặc định
ratchet freak

4
Tôi sẽ giả structs được sử dụng chủ yếu là do sự vĩ đại đa số phần cứng nhúng được mã hóa trong C, vì vậy bất cứ ai dành rất nhiều thời gian viết code cho MCUs nhỏ lẽ biết C nhiều hơn sau đó C ++, và tự động đạt cho C thành ngữ trước khi thành ngữ C ++. Đó là một vấn đề hiệu suất lập trình viên .
Sói Connor

Câu trả lời:


11

Như được lấy từ câu trả lời được chấp nhận từ Khi nào bạn nên sử dụng một lớp so với một cấu trúc trong C ++?

Sự khác biệt duy nhất giữa một lớp và một cấu trúc trong C ++ là các cấu trúc có các thành viên công khai mặc định và các cơ sở và các lớp có các thành viên và cơ sở riêng mặc định. Cả hai lớp và cấu trúc có thể có một hỗn hợp của các thành viên công cộng và tư nhân, có thể sử dụng sự kế thừa và có thể có các chức năng thành viên.

Tôi sẽ khuyên bạn nên sử dụng các cấu trúc như các cấu trúc dữ liệu cũ đơn giản mà không có bất kỳ tính năng nào giống như lớp và sử dụng các lớp làm cấu trúc dữ liệu tổng hợp với dữ liệu riêng và các hàm thành viên.

Bộ nhớ công cụ sửa đổi truy cập không có sự khác biệt và do các hạn chế về bộ nhớ của Arduino, mọi người ít sử dụng các lớp có cấu trúc phân cấp phức tạp, nhưng dù sao cũng thích các cấu trúc POD hơn.


5

Không giống như C, một thể hiện của a structtrong C ++ là một đối tượng theo cách chính xác giống như một thể hiện của a class. Từ quan điểm của mã được biên dịch, chúng giống hệt nhau. Sử dụng bộ nhớ, căn chỉnh, thời gian truy cập, vv là hoàn toàn giống nhau (tức là không có chi phí chung).

Từ quan điểm của lập trình viên, có một sự khác biệt rất nhỏ. Các thành viên của một structmặc định có khả năng hiển thị công khai theo mặc định, trong khi các thành viên của một chế classđộ hiển thị riêng tư theo mặc định. Mặt khác, tất cả các tính năng ngôn ngữ hoạt động giống nhau trên cả hai, chẳng hạn như hàm tạo / hàm hủy, kế thừa, đa hình, mẫu và nạp chồng toán tử. Bạn thậm chí có thể lấy được a structtừ a classvà ngược lại.

Mặc dù có sự tương đồng, nhưng khá phổ biến khi thấy mọi người cố tình sử dụng một structC ++ cho các cấu trúc rất đơn giản, ví dụ, nơi nó chỉ bao gồm một vài thành viên dữ liệu, nhưng không có chức năng. A classsẽ được sử dụng cho bất cứ điều gì phức tạp hơn. Đây hoàn toàn là một vấn đề về quy ước hoặc sở thích cá nhân, và có thể được sử dụng như một dấu hiệu tinh tế cho sự phức tạp dự định của cấu trúc.


4

Như các câu trả lời khác đã chỉ ra, cụ thể của bạn structclass hiệu suất không thể phân biệt khôn ngoan (Có sự khác biệt nhỏ trong phạm vi của tên loại, do cách bạn xác định cấu trúc của mình). Phân định trong C ++ không phải là giữa structclass, mà là giữa các loại là POD (dữ liệu cũ đơn giản) và các loại không, như được giải thích trong cuộc thảo luận này .


3

Về bộ nhớ, điều này sẽ tạo ra sự khác biệt gì?

Không ai. Cấu trúc và các lớp là như nhau, chỉ khác nhau về mức độ bảo vệ và việc tạo ra một trong hai đối tượng sẽ tạo ra một 'đối tượng'.

vẫn thấy kỹ thuật struct đang được sử dụng nhiều - tại sao lại thế này?

Ít gõ hơn nếu bạn không cố gắng ẩn thành viên dữ liệu.


2

Lưu ý rằng

typedef struct { ... } Foo;

đã lỗi thời trong C ++ và bạn chỉ nên sử dụng

struct Foo { ... };

Các câu trả lời không rõ ràng lắm nhưng tác dụng khác của cấu trúc là kế thừa công khai theo mặc định so với thừa kế riêng theo mặc định với các lớp.

Như đã đề cập bởi những người khác, sử dụng struct thường là quy ước cho các loại POD.

Ngoài ra về mặt kỹ thuật 'struct vs object' phải là 'struct vs class' (vì việc tạo một struct hoặc một lớp vẫn cho một đối tượng).


Đối tượng câu hỏi đã chỉnh sửa-> lớp.
Cyberg Ribbon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.