구조체와 클래스를 사용할 때 어떤 오버 헤드와 다른 고려 사항이 있습니까?


17

임베디드 시스템의 C는 전통적으로 구조체를 사용하여 구조화 된 데이터를 보유합니다.

Arduino는 C ++을 테이블에 제공하므로 클래스를 대신 사용할 수 있습니다.

매우 유사한 것으로 간주 될 수있는 두 가지 데이터 구조가 있다고 가정 해 보겠습니다.

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

과:

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

메모리면에서 이것이 어떤 차이가 있습니까?

여전히 구조체 기술이 많이 사용되는 것을 볼 수 있습니다. 왜 이런가요?


5
내 C를 기억하면 ++ 제대로간에 차이가없는 structclass기본 가시성 외에
래칫 괴물

4
나는 가정 것이다 struct때문에 S가 주로 사용하는 작은 MCU에 시간을 쓰는 코드를 많이 소비하는 사람은 아마 C ++ 숙어 전에 C 관용구에 도달 자동으로 다음 더 나은 C를 알고있는 C ++, 그래서, 임베디드 하드웨어의 대부분은 C로 코딩되어있다. 그것은의 프로그래머 성능 문제.
코너 울프

답변:


13

C ++에서 클래스와 구조체언제 사용해야합니까?

C ++에서 클래스와 구조체의 유일한 차이점은 구조체에 기본 공용 멤버와 기본이 있고 클래스에 기본 개인 멤버와 기본이 있다는 것입니다. 클래스와 구조체는 모두 공용 멤버와 개인 멤버를 혼합하고 상속을 사용할 수 있으며 멤버 함수를 가질 수 있습니다.

클래스와 같은 기능이없는 평범한 데이터 구조로 구조체를 사용하고 개인 데이터 및 멤버 함수가있는 집계 데이터 구조로 클래스를 사용하는 것이 좋습니다.

메모리 측면에서 보면 액세스 수정자는 차이가 없으며 Arduino의 메모리 제약 조건으로 인해 사람들은 복잡한 계층 구조를 가진 클래스를 사용할 가능성은 적지 만 어쨌든 POD 구조체를 선호합니다.


6

C와 달리 C struct++에서 의 인스턴스는의 인스턴스 와 정확히 같은 방식으로 객체입니다 class. 컴파일 된 코드의 관점에서 그것들은 동일합니다. 메모리 사용량, 정렬, 액세스 시간 등은 정확히 동일합니다 (즉, 오버 헤드가 없음).

프로그래머의 관점에서 볼 때 매우 작은 차이가 있습니다. struct기본적으로 공개 구성원의 공개 가시성을 갖는 반면 기본적으로 공개 구성원의 class비공개 가시성이 있습니다. 그렇지 않으면 생성자 / 소멸자, 상속, 다형성, 템플릿 및 연산자 오버로드와 같은 모든 언어 기능이 동일하게 작동합니다. 당신은을 유도도 할 수 structA로부터 class, 반대의 경우도 마찬가지.

유사성에도 불구하고 사람들 struct이 아주 간단한 구조를 위해 의도적으로 C ++에서 in을 사용하는 것을 보는 것이 일반적 입니다. A class는 더 복잡한 것에 사용됩니다. 이것은 순전히 컨벤션이나 개인적 취향의 문제이며 구조의 복잡성을 나타내는 미묘한 표시로 사용할 수 있습니다.


4

다른 답변에서 지적했듯이, 귀하의 구체적 struct이고 class구별 할 수없는 성능이 현명합니다 (구조를 정의한 방식으로 인해 유형 이름의 범위에 약간의 차이가 있습니다). C ++의 묘사 사이에하지 structclass되지만 유형 사이 POD (일반 이전 데이터) 에 설명 된대로되지 않고 유형 이 토론 .


3

메모리면에서 이것이 어떤 차이가 있습니까?

없음 구조와 클래스는 같은 수준이며 보호 수준 만 다르며 인스턴스화하면 '개체'가 만들어집니다.

여전히 struct 기술이 많이 사용되는 것을 볼 수 있습니다. 왜 이런가요?

데이터 멤버를 숨기려고하지 않으면 타이핑이 줄어 듭니다.


2

참고

typedef struct { ... } Foo;

C ++에서는 더 이상 사용되지 않으며 사용해야합니다.

struct Foo { ... };

답은 명확하지 않지만 구조체의 다른 효과는 기본적으로 공용 상속과 클래스의 기본 상속을 상속하는 것입니다.

다른 사람들이 언급했듯이 struct 사용은 일반적으로 POD 유형에 대한 규칙입니다.

또한 기술적으로 'struct vs object'는 'struct vs class'이어야합니다 (struct 또는 클래스를 인스턴스화하면 여전히 객체가 제공되므로).


편집 된 질문 객체-> 클래스.
Cybergibbons
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.