C 대 C ++ 구조체 정렬
C ++ 구조체 필드 정렬에 대한 최근 인터뷰에서 C와 C ++가 구조체 패킹에서 동일한 전략을 따른다는 이론을 제시했습니다.
Hovewer, 그것은 잘못된 가정이었습니다. 면접관은 일반적으로 C와 C ++가 서로 다른 방식으로 구조체를 패킹하고 있으며 그 반대를 기 대해서는 안된다고 말했습니다. IMHO 이상한 진술입니다. pack "C"
이중 언어 C / C ++ 헤더 파일에서 사용하기위한 C ++의 구조체에 대한 한정자 는 없습니다 .
따라서 실제로는 일반적으로 필드가 다른 방식으로 정렬되고 오프셋이 다르기 때문에 C ++로 구조체를 생성하여 C 라이브러리에 전달할 수 없음을 의미 할 수 있습니다. 그러나 실제로 대부분의 프로그래머는 C POD 구조체에 대한 포인터를 일부 도우미 메서드를 사용하여이 구조체 주위의 C ++ 래퍼에 대한 참조 로 변환 할 때까지이 상호 운용성에 심각하게 의존 합니다. 이 문제를 명확히 해주시겠습니까?
C 및 C ++ 언어 표준은 모두 구조체 패딩에 대한 요구 사항을 만들지 않으며 컴파일러 구현 세부 사항으로 남겨 둡니다. 이것에 대한 엄격한 해석은 구조체가 둘 사이에 동일하다는 보장이 없다는 것을 의미합니다.
그러나 실제로는 C와 C ++ (예 : GCC 또는 Clang)를 모두 지원하는 주어진 버전의 도구 모음이 필요한 경우 동일한 방식으로 동일한 구조체를 패킹 할 수 있습니다. 이것이 없으면 세계의 많은 프로덕션 코드가 작동하지 않을 것입니다. 그러나 이것은 언어가 아니라 도구 체인에서 제공하는 보증 입니다.
C 원본과 유사한 구조체를 선언했지만 액세스 지정자 ( private
, public
및 protected
)를 추가 하면 레이아웃이 변경되지만 구조체가 더 이상 동일하지 않기 때문에 약간 늘어난다는 점에 주목할 가치 가 있습니다.
이것은 (면접관 측에서) 가장 명백하게 잘못되었습니다. 구조체 패킹이 구조체를 다루는 저수준 API ( 예 : 네트워크 API) 로 작업 한 모든 사람에게 C와 C ++에 대해 동일하다는 것은 분명합니다 . 이 모든 것은 'C'구조체를 받아들이는 C 함수이지만 C ++ 코드에서 하루에 수백만 번 안전하게 호출됩니다.
이 질문에 대해 운이 좋을 것입니다. 그곳에서 일해서는 안된다는 것이 분명합니다.
C ++가 개발되었을 때 개발자들은 C 프로그래머가 C ++ 개발자가 보장하고 싶지 않은 몇 가지 사항에 의존한다는 사실을 알아 냈지만 보장하지 않으면 유효한 C ++ 코드이기도 한 많은 C 코드가 사용시 손상 될 수 있습니다. C ++ 코드로. 바람직하지 않습니다.
이것이 바로 그들이 "POD"구조를 발명 한 이유입니다. C ++ 기능을 사용하지 않는 구조체는 C 프로그램에서와 똑같이 C ++ 프로그램에서 동작합니다 (구현 정의 동작이 변경 될 수 있다는 사실과는 별개로, C 컴파일러와 C ++ 컴파일러는 분명히 동일한 구현이 아닙니다. 반면에 C ++ 컴파일러는 아마도 C 컴파일러에서 구현 정의를 복사 할 것입니다.
유효한 C ++ 구조체이기도 한 일반 C 구조체 (예 : "class"라는 멤버 없음)를 사용하고 여는 중괄호 바로 뒤에 "public :"을 추가 한 다음 해당 레이아웃, 멤버 순서, 정렬 모든 것이 바뀔 수 있습니다. 모든 구조체 멤버는 기본적으로 공용이므로 실제로 변경된 사항은 없습니다. "공개"라는 점을 제외하고는 더 이상 POD가 아닙니다.
참고 URL : https://stackoverflow.com/questions/33835569/c-vs-c-struct-alignment
'Programing' 카테고리의 다른 글
Go에 람다 식이나 비슷한 것이 있습니까? (0) | 2020.11.28 |
---|---|
D3 차트의 레이블에 줄 바꿈을 어떻게 포함합니까? (0) | 2020.11.28 |
dotnet cli와 새로운 vs2017 msbuild 간의 관계 (0) | 2020.11.28 |
ELMAH를 사용하는 WCF 서비스에 대한 예외 로깅 (0) | 2020.11.28 |
데이터베이스 호출에 대한 단위 테스트를 작성하는 방법 (0) | 2020.11.28 |