c 언어 중attribute__의미

4329 단어 데이터 구조
우 리 는 데이터 구 조 를 정의 하여 데이터 구조의 크기 를 계산 하거나 네트워크 통신 을 하 는 socket 에서 데 이 터 를 보 낼 때 공 통 된 문제 에 부 딪 힐 수 있 습 니 다. 데이터 정렬 문제 입 니 다.
이 문 제 는 하드웨어 가 방문 데이터 의 효율 을 높이 기 위해 발생 하 는 문제 이다. 여기 서 왜 데이터 의 방문 효율 을 높 일 수 있 는 지, 관심 이 있 는 사람, 인터넷 에 모두 있 는 지 구체 적 으로 말 하지 않 는 다.
이 문 제 는 실제 존재 하 는 것 이 고 소프트웨어 가 이렇게 여러 해 동안 발전 한 이상 분명 해결 방법 이 있 을 것 이다. 다음은 흔히 볼 수 있 는 세 가지 방법 을 간단하게 소개 한다.
1. 수 동 으로 정렬 하고 자신 이 정의 한 데이터 구조 에 따라 크기 에 따라 일정한 규칙 에 따라 병력 을 배치 하면 데이터 구 조 를 치밀 하 게 하고 메모리 공간 이 최대한 적 게 생 길 수 있다.
이런 방법 은 실제 적 으로 우리 에 게 좋 은 프로 그래 밍 습관 을 요구 하 는 것 이다. 그러면 우리 코드 의 청결 성 을 높 일 수 있 고 메모리 공간 도 절약 할 수 있다.
2.\# pragam pack (n) 을 사용 하여 데이터 구 조 를 정렬 합 니 다.
이 예비 처리 명령 중의 n 은 바로 그 바이트 에 따라 정렬 하 는 것 이다. n = 1 ~ 4 이 고 반드시 2 의 배수 여야 한다.
n = 4 일 때 우리 의 기본 데이터 구조 정렬 방식 입 니 다.
n = 1 일 때 공간 을 가장 절약 하 는 방법 이다.
예전 에는 하드웨어 조건 의 제한 을 받 아 메모리 의 점용 을 줄 일 수 있 으 면 메모 리 를 최대한 적 게 점용 해 야 이렇게 할 수 있 었 다. 그러나 현재 의 메모리 칩 은 걸핏하면 G 에 올 라 가 고 심지어 T 에 올 라 가 예전 의 K 급 칩 용량 보다 훨씬 많아 졌 다.
3. attribute (packed) 를 사용 하여 컴 파일 러 가 컴 파일 과정 에서 의 최적화 정렬 을 취소 하고 실제 점용 바이트 수 에 따라 정렬 하도록 합 니 다. 이 경우 양쪽 모두 attribute (packed) 를 사용 하여 최적화 정렬 을 취소 해 야 합 니 다. 정렬 된 오류 현상 이 나타 나 지 않 습 니 다.
이런 방식 은 위의 두 번 째 방식 과 같다.
이 문제 에 대해 개인 적 으로 연구 할 만 한 것 이 없다 고 생각 합 니 다. 존재 하면 존재 합 니 다. 우리 의 하드웨어 는 너무 큽 니 다. 왜냐하면 신중 국 이 설립 된 시기 가 아니 라 메모리 가 있 습 니 다.확실히 알 고 싶 거나 강박 증 이 있 는 사람 은 attribute 에 관 한 사용 규칙, 문법 을 계속 볼 수 있 습 니 다.
attribute 의 사용 규칙 은 인터넷 에서 유래 합 니 다:
1. attribute (packed) 의 역할 은 컴 파일 러 가 컴 파일 과정 에서 의 최적화 정렬 을 취소 하고 실제 점용 바이트 수 에 따라 정렬 하 는 것 을 알려 주 는 GCC 특유 의 문법 이다.이 기능 은 운영 체제 와 상 관 없 이 컴 파일 러 와 관련 이 있 습 니 다. gcc 컴 파일 러 는 컴 팩 트 모드 가 아 닙 니 다. 저 는 windows 에서 vc 컴 파일 러 를 사용 하 는 것 도 컴 팩 트 하지 않 습 니 다. tc 컴 파일 러 를 사용 하면 컴 팩 트 합 니 다.예 를 들 면:
TC 에서: struct my {char ch; int a;} size of (int) = 2;sizeof(my)=3;(컴 팩 트 모드)
GCC 아래: struct my {char ch; int a;} size of (int) = 4;sizeof(my)=8;(비 컴 팩 트 모드)
GCC 아래: struct my {char ch; int a;} attrubte (packed) sizeof (int) = 4;sizeof(my)=5
2. attribute 키 워드 는 함수 나 데이터 성명 에서 속성 을 설정 하 는 데 사 용 됩 니 다.함수 에 속성 을 부여 하 는 주요 목적 은 컴 파 일 러 를 최적화 시 키 는 데 있다.함수 성명 의 attribute (noreturn) 는 컴 파일 러 에 게 이 함수 가 호출 자 에 게 되 돌아 오지 않 고 컴 파일 러 가 최적화 할 때 불필요 한 함수 반환 코드 를 제거 하도록 알려 주 는 것 입 니 다.
GNU C 의 가장 큰 특징 은 attribute 메커니즘 이다.attribute 는 함수 속성 (Function Attribute), 변수 속성 (Variable Attribute), 유형 속성 (Type Attribute) 을 설정 할 수 있 습 니 다.
attribute 쓰기 특징 은 attribute 앞 뒤 에 두 개의 밑줄 이 있 고 뒤 에는 한 쌍 의 괄호 가 붙 으 며 괄호 안에 해당 하 는 attribute 매개 변수 가 있 습 니 다.
attribute 문법 형식:
attribute ((attribute-list))
그 위치 제약: 성명 의 끝 에 놓 습 니 다.
함수 속성 (Function Attribute): 함수 속성 은 개발 자가 함수 성명 에 일부 특성 을 추가 하 는 데 도움 을 주어 컴 파일 러 가 오류 검사 에 있어 서 의 기능 을 더욱 강하 게 할 수 있 습 니 다.attribute 메커니즘 도 비 GNU 프로그램 과 호 환 되 기 쉽다.
GNU CC 는 – Wall 컴 파일 러 를 사용 하여 이 기능 을 활성화 시 켜 야 합 니 다. 이것 은 경고 메 시 지 를 제어 하 는 좋 은 방법 입 니 다.
packed 속성: 이 속성 을 사용 하면 변수 나 구조 체 구성원 들 이 최소 정렬 방식 을 사용 할 수 있 습 니 다. 즉, 변 수 는 바이트 정렬 이 고 도 메 인 (field) 은 비트 정렬 입 니 다.
만약 당신 이 GPSR 프로 토 콜 이 Tinyos 에서 실현 되 는 것 을 보 았 다 면, 당신 은 반드시 아래 의 문 구 를 주의 할 것 입 니 다.
typedef struct {
    double x;
    double y;
} __attribute__((packed)) position_t;

처음에는 이해 할 수 있 었 는데, 머지않아 구조 체 를 정의 하 는 거 잖 아!그런데 뒤에 있 는 문 구 를 보면 안개 가 낄 수도 있어 요. 'attribute (packed)' 가 뭐 예요?무슨 효과 가 있 습 니까?일련의 의문 이 곧 네 머 릿 속 에서 튀 어 나 올 것 이다.프로그램 전 체 를 이해 하 는 데 는 아무런 영향 이 없 지만 이런 의문 들 을 내 머 릿 속 에 계속 두 고 싶 지 않다. 부담 이 너무 크다.나중에 잊 지 않도록, 그리고 언젠가 쓸 수 있 을 지도 몰라.이 문 제 를 똑똑히 알 아 라!
GNU C 의 가장 큰 특징 은 바로 attribute 메커니즘 이다.attribute 는 함수 속성 (Function Attribute), 변수 속성 (Variable Attribute), 유형 속성 (Type Attribute) 을 설정 할 수 있 습 니 다.attribute 문법 형식 은: attribute ((attribute - list)) 입 니 다.
그 위 치 는 성명 의 끝부분 에 놓 기 전에 제약 된다.
packed 는 유형 속성 (Type Attribute) 의 매개 변수 로 packed 를 사용 하면 대상 이 차지 하 는 공간 을 줄 일 수 있 습 니 다.주의해 야 할 것 은 attribute 속성의 효력 은 커 넥 터 와 도 관련 이 있 습 니 다. 커 넥 터 가 최대 16 바이트 만 지원 한다 면 32 바이트 정렬 을 정의 하 는 것 도 도움 이 되 지 않 습 니 다.
이 속성 을 사용 하여 struct 나 union 형식 을 정의 하고 그 유형의 모든 변수의 메모리 제약 을 설정 합 니 다.enum 형식 정의 에 사용 할 때 최소 완전한 형식 을 사용 해 야 한 다 는 것 을 암시 합 니 다 (it indicates that the smallest integral type should be used).
아래 의 예 에서 my - packed - struct 형식의 변수 배열 의 값 은 치밀 하지만 내부 의 구성원 변수 s 는 'pack' 되 지 않 습 니 다. 내부 의 구성원 변수 도 packed 되 기 를 원한 다 면 my - unpacked - struct 도 packed 를 사용 하여 해당 하 는 제약 을 해 야 합 니 다.

좋은 웹페이지 즐겨찾기