C + + 에서 struct 길 이 는 각각 struct 요소 의 길이 와 다 릅 니 다.

전환 하 다http://bbs.chinaunix.net/thread-794334-1-1.html
GNU C / C + + 에서 sizeof (struct xys) 와 struct 구성원 size 의 일치 하지 않 음 X86, Linux Redhat 8.0, gcc / g + v 3.2 
struct xyz
{

	char a;

	double b;

} xyz;

32 비트 컴 파일 러 에서 성능 을 고려 하여 struct (유 니 온 등 다른 데이터 구조 포함) 의 크기 와 모든 구성원 변수의 위 치 는 레지스터 / 메모리 접근 값 의 경계 요구 에 따라 align 을 만 들 었 습 니 다.이 로 인해 sizeof (xyz) = 16 은 실제 구성원 이 차지 하 는 공간 과 sizeof (char) + sizeof (double) = 9 가 아 닌 문제 가 되 지 않 지만 공간 이 부족 하거나 특별한 요구 가 있 는 응용 에 대해 서 는 struct 의 치밀 한 실현 을 고려 해 야 한다.예 를 들 어 서버 에서 들 어 오 는 고정 형식의 패 킷 을 하나의 구조 에 직접 투사 하여 접근 하기 편리 합 니 다.
union 
{

	char bytes[9];

	struct xyzstruct data;

} uvw;

만약 이곳 의 struct / union 이 치밀 하 게 실현 된다 면, 우 리 는 uvw. data 를 통 해 bytes 의 데 이 터 를 직접 방문 할 수 있 습 니 다. 코드 를 따로 작성 하지 않 아 도 됩 니 다.해결 방법: 1. gcc 의 컴 파일 옵션 인 '- fpack - struct' 는 struct 구조 에 추 가 된 hole 을 제거 할 수 있 습 니 다. 단점 은 응용 프로그램의 모든 struct 에 영향 을 주 고 다른 라 이브 러 리 에서 도 입 된 struct 구 조 를 포함 합 니 다.
2. __attribute__ (포장) 성명
struct 
{
	char a; 
	double b;
} xyz __attribute__ ((packed));

그러나 이러한 간단 한 형식의 성명 은 C 에 만 유효 합 니 다. C + + 에 서 는 struct 의 모든 구성원 (size > 1) 에 대해 이러한 성명 을 해 야 합 니 다.
struct 
{

	char a;

	double b __attribute__ ((packed));

	int c __attribute__ ((packed));

} xyz;

3. 사전 컴 파일 옵션 \ # pragma pack (n) 여기 n 은 컴 파일 러 가 이 'pragma' 줄 에 나타 난 모든 데이터 구조 (stuct / union 포함) 를 n 바이트 로 정렬 하 는 것 을 알 립 니 다 (align).n = 1 이면 전체 가 치밀 하 다 는 뜻 이 고 struct 에 서 는 어떠한 자리 잡 는 hole 도 나타 나 지 않 습 니 다.n 이 비어 있 으 면 컴 파일 러 가 부족 한 설정 (일반 = 8) \ # pragma pack (1) / / 이 구간 의 모든 데이터 구조 가 치밀 하 다 는 뜻 입 니 다.

좋은 웹페이지 즐겨찾기