구조 정렬 C/C++
c/c++(이 점에 있어서는 동일하다고 가정합니다)에서, 다음과 같은 것이 있을 것입니다.
struct S {
T a;
.
.
.
} s;
다음 내용이 사실로 보장됩니까?
(void*)&s == (void*)&s.a;
아니면 첫 번째 멤버 이전에 패딩이 없다는 보장이 있는 건가요?
C에서는 그렇습니다, 주소가 같습니다.간단하면서도 간단합니다.
C++, 아니요, 같은 주소가 아닙니다.기본 클래스는 모든 구성원보다 우선할 수 있으며 가상 구성원 함수는 일반적으로 어딘가에 숨겨진 데이터를 구조에 추가합니다.C++ 컴파일러는 클래스가 표준 레이아웃 유형이 아닌 한 임의로 멤버를 재배치할 수도 있습니다(어떤 컴파일러도 그렇게 하는 것은 모릅니다).
마지막으로 C++ 구조가 표준 레이아웃 유형으로 구성되어 있고 기본 클래스나 가상 함수가 없고 모든 구성원이 동일한 가시성을 가지고 있으며 다른 제한 사항을 잊어버린 경우 C 규칙에 따라 다시 적용되며 첫 번째 구성원이 개체 자체와 동일한 주소에 있어야 합니다.
§ 9.2/7
표준 레이아웃 클래스는 다음과 같은 클래스입니다.
— 비표준 layout 클래스(또는 그러한 유형의 배열) 또는 참조의 비정규 데이터 멤버가 없습니다.
— 가상 기능(10.3) 및 가상 기본 클래스(10.1)가 없습니다.
— 모든 비정전 데이터 멤버에 대해 동일한 접근 제어(제11항)를 갖습니다.
— 비표준 layout 기본 클래스가 없습니다.
— 가장 많이 파생된 클래스와 최대 하나의 기본 클래스에 비정규 데이터 멤버가 없거나, 비정규 데이터 멤버가 있는 기본 클래스가 없습니다.
— 는 첫 번째 비정규 데이터 멤버와 같은 유형의 기본 클래스가 없습니다.
§ 9.2/20
retrepect_cast를 사용하여 적절히 변환된 표준 레이아웃 구조 객체에 대한 포인터는 초기 멤버(또는 해당 멤버가 비트 필드인 경우 해당 멤버가 있는 단위)를 가리키며 그 반대도 마찬가지입니다.[ 참고:따라서 적절한 정렬을 위해 필요한 경우 표준 배치 구조 객체 내에 이름 없는 패딩이 있지만 초기에는 없을 수 있습니다.—끝 노트 ]
네.
C의 첫 번째 구조 부재 앞과 C++(POD인 경우)에 패딩이 없음을 보장합니다.
C 인용문:
(C11, 6.7.2.1p15) "구조 객체 내에 이름 없는 패딩이 있을 수 있지만, 그 처음에는 없습니다."
C++ 견적:
(C++11, 9.2p20) "따라서 적절한 정렬을 달성하기 위해 필요한 경우 표준 배치 구조 객체 내에 이름 없는 패딩이 있을 수 있지만, 초기에는 없을 수 있습니다."
언급URL : https://stackoverflow.com/questions/17845128/struct-alignment-c-c
'programing' 카테고리의 다른 글
| Swift에서 상태 표시줄 높이 (0) | 2023.10.28 |
|---|---|
| 메뉴 트리의 일부를 표시하는 방법? (0) | 2023.10.28 |
| 다단계 도커 파일의 공유 변수: 대체되지 않은 FROM 이전 ARG (0) | 2023.10.28 |
| 순서 없는 목록 항목에서 들여쓰기를 제거하는 방법은 무엇입니까? (0) | 2023.10.28 |
| ASP에서 사용자 목록을 가져오는 방법NET 아이덴티티? (0) | 2023.10.28 |