문제

왜 다음 두 가지 유형이 있는지 궁금합니다.

struct {
    double re[2];
};

그리고

double re[2];

C에서 같은 크기를 가지고 있습니까?구조체가 약간의 크기 오버헤드를 추가하지 않습니까?

도움이 되었습니까?

해결책

아니요, 단지 모든 요소를 ​​개별 요소의 크기를 합산한 하나의 상위 수준 요소로 구성할 뿐입니다(정렬 규칙에 따라 일부 패딩도 추가되지만 이는 이 질문의 범위를 벗어납니다).

다른 팁

그것이 도움이 될 수 있다면 - 아니오. C는 전염병과 같은 오버 헤드를 피합니다. 구체적으로,이 맥락에서는 오버 헤드를 피합니다.

다른 구조를 사용한 경우 차이가 표시 될 수 있습니다.

struct space_filled
{
    char       part0;
    double     part1;
};

기계가 필요한 경우 double 8 바이트 경계에 정렬됩니다 (및 sizeof(double) == 8, 이는 정상이지만 표준에 의해 의무화되지 않은 경우) 구조가 16 바이트를 차지한다는 것을 알게 될 것입니다.

아니, 구조물은 아무것도 추가 할 필요가 없습니다. Class (및 Structs)는 C 및 C ++에서 다른 많은 책임이있는 Java 또는 .NET와 달리 많은 데이터 구성원을 보유하는 데 사용되는 컨테이너입니다. C ++에서는 존재하는 경우 가상 함수 호출을 해결하기 위해 vtable을 저장해야 할 수도 있지만 일반적으로 구조물 자체에는 오버 헤드가 없습니다.

한 가지 예외는 다음과 같습니다.

typedef struct {} empty;
assert(sizeof(empty) > 0);

빈 구조물의 크기 ~ 아니다 0이 되십시오. 구조물에는 있어야합니다 약간 모든 객체에는 고유 한 주소가 있어야하므로 0이 아닌 크기. (그렇지 않으면이 스트러크 배열을 만들 수 없습니다)

아니요. 구조물은 크기를 추가하지 않거나 컴파일 된 C에서 오버 헤드가 없습니다.

컴파일러의 추가 작업이 필요하지만 런타임에는 오버 헤드가없는 구문 레이어입니다.

C는 매우 "벌거 벗은"언어로, 필요하지 않은 경우에는 아무것도 없다는 것을 의미합니다. 따라서 "구조물에 어떤 오버 헤드가 필요합니까?"라고 스스로에게 물어보십시오.

아니요.

그것은 구조의 좋은 점 중 하나입니다 (구식 TCP/IP 프로그래밍에서 도움이 된 이유).

메모리/버퍼 레이아웃을 나타내는 좋은 방법입니다.

C의 구조물 유형 없음 메모리에있는 멤버를 순차적으로 레이아웃합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top