มีค่าโสหุ้ยและการพิจารณาอื่น ๆ อะไรบ้างเมื่อใช้ struct กับคลาส


17

C บนระบบฝังตัวมีแบบดั้งเดิมใช้ structs เพื่อเก็บข้อมูลที่มีโครงสร้าง

Arduino นำ C ++ มาไว้ในตารางเพื่อให้เราสามารถใช้คลาสแทนได้

ให้บอกว่าเรามีโครงสร้างข้อมูลที่แตกต่างกันสองแบบซึ่งอาจถือว่าคล้ายกันมาก:

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

และ:

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

ในแง่ของความทรงจำสิ่งนี้จะทำให้แตกต่างกันอย่างไร

ฉันยังคงเห็นว่ามีการใช้เทคนิคโครงสร้างอย่างหนัก - ทำไมจึงเป็นเช่นนี้


5
ถ้าฉันจำ C ++ ของฉันได้อย่างถูกต้องไม่มีความแตกต่างระหว่างstructและclassนอกเหนือจากการมองเห็นเริ่มต้น
ratchet freak

4
ฉันจะถือว่าstructs ที่ใช้เป็นหลักเพราะดีส่วนใหญ่ของฮาร์ดแวร์ฝังตัวเป็นรหัสใน C เพื่อให้ทุกคนที่ใช้จ่ายจำนวนมากของการเขียนรหัสเวลาสำหรับ MCUs ขนาดเล็กอาจจะรู้ C ดีมากแล้ว C ++ และเอื้อมมือไปโดยอัตโนมัติสำหรับสำนวน C ก่อน c ++ สำนวน มันเป็นปัญหาประสิทธิภาพของโปรแกรมเมอร์
Connor Wolf

คำตอบ:


13

เป็นที่นำมาจากคำตอบที่ยอมรับจากเมื่อคุณควรใช้ class กับ a struct ใน C ++?

ข้อแตกต่างระหว่างคลาสและโครงสร้างใน C ++ คือโครงสร้างที่มีสมาชิกสาธารณะเริ่มต้นและฐานและชั้นเรียนมีสมาชิกและฐานเริ่มต้นส่วนตัว ทั้งชั้นเรียนและโครงสร้างสามารถมีส่วนผสมของสมาชิกภาครัฐและเอกชนสามารถใช้การสืบทอดและสามารถมีฟังก์ชั่นสมาชิก

ฉันอยากจะแนะนำให้ใช้ structs เป็นโครงสร้างข้อมูลแบบเก่าโดยไม่มีคุณสมบัติคล้ายคลาสและใช้คลาสเป็นโครงสร้างข้อมูลรวมที่มีข้อมูลส่วนตัวและฟังก์ชั่นสมาชิก

หน่วยความจำอย่างชาญฉลาดตัวดัดแปลงการเข้าถึงทำให้ไม่แตกต่างกันและเนื่องจากข้อ จำกัด ของหน่วยความจำของ Arduino ผู้คนมีโอกาสน้อยกว่าที่จะใช้คลาสที่มีลำดับชั้นที่ซับซ้อน แต่ชอบ POD structs ต่อไป


6

ซึ่งแตกต่างจาก C, อินสแตนซ์ของstructใน C ++ classเป็นวัตถุในทางเดียวกันว่าเป็นตัวอย่างของหนึ่ง จากมุมมองของรหัสที่รวบรวมพวกเขาจะเหมือนกัน การใช้หน่วยความจำการจัดตำแหน่งเวลาในการเข้าถึงเป็นต้นนั้นเหมือนกันทุกประการ (เช่นไม่มีโอเวอร์เฮด)

จากมุมมองของโปรแกรมเมอร์มีความแตกต่างเล็กน้อยมาก สมาชิกของ a structมีทัศนวิสัยสาธารณะตามค่าเริ่มต้นในขณะที่สมาชิกของ a classมีทัศนวิสัยส่วนตัวตามค่าเริ่มต้น มิฉะนั้นคุณสมบัติภาษาทั้งหมดจะทำงานเหมือนกันทั้งสองอย่างเช่น constructors / destructors, การสืบทอด, polymorphism, template, และ overloading ของ operator คุณยังสามารถหา a structจากclassและในทางกลับกัน

แม้จะมีความคล้ายคลึงกัน แต่ก็เป็นเรื่องปกติที่จะเห็นคนใช้เจตนาstructใน C ++ สำหรับโครงสร้างที่ง่ายมากเช่นที่ซึ่งประกอบด้วยสมาชิกข้อมูลเพียงไม่กี่คน แต่ไม่มีฟังก์ชั่น classจะใช้สำหรับอะไรที่ซับซ้อนมากขึ้น นี่เป็นเพียงเรื่องของการประชุมหรือความชอบส่วนตัวเท่านั้นและสามารถใช้เป็นเครื่องบ่งบอกถึงความซับซ้อนที่ตั้งใจไว้ของโครงสร้าง


4

ตามที่คำตอบอื่น ๆ ได้ระบุไว้โดยเฉพาะอย่างยิ่งของคุณstructและclassประสิทธิภาพการทำงานที่แยกไม่ออก (มีความแตกต่างเล็กน้อยในขอบเขตของชื่อประเภทเนื่องจากวิธีที่คุณกำหนด struct ของคุณ) การอธิบายใน C ++ ไม่ได้อยู่ระหว่างstructและclassแต่ระหว่างชนิดที่เป็นPOD (ข้อมูลเก่าธรรมดา)และประเภทที่ไม่ดังที่อธิบายไว้ในการสนทนานี้


3

ในแง่ของความทรงจำสิ่งนี้จะทำให้แตกต่างกันอย่างไร

ไม่มี. โครงสร้างและคลาสเป็นสิ่งเดียวกันโดยมีระดับการป้องกันที่แตกต่างกันเท่านั้น

ยังคงเห็นเทคนิคการใช้งานอย่างหนัก - ทำไมนี่

พิมพ์น้อยลงถ้าคุณไม่พยายามซ่อนสมาชิกข้อมูล


2

สังเกตได้ว่า

typedef struct { ... } Foo;

ล้าสมัยใน C ++ และคุณควรใช้

struct Foo { ... };

มันไม่ชัดเจนมากในคำตอบ แต่ผลกระทบอื่น ๆ ของ structs คือการสืบทอดสาธารณะโดยค่าเริ่มต้นเทียบกับการสืบทอดส่วนตัวโดยค่าเริ่มต้นกับคลาส

ตามที่ผู้อื่นกล่าวถึงการใช้ struct มักเป็นแบบแผนสำหรับประเภท POD

นอกจากนี้ในทางเทคนิคแล้ว 'struct vs object' ควรเป็น 'struct vs class' (เช่นการสร้างอินสแตนซ์ของ struct หรือคลาสยังคงให้ออบเจ็กต์)


แก้ไขคำถาม object-> class
Cybergibbons
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.