programing

구조 정렬 C/C++

anycallme 2023. 10. 28. 08:12

구조 정렬 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