[GNU C] __attribute__

Jeongkyu(Jun)·2022년 12월 21일

C/C++

목록 보기
1/3
  • __attribute__ 키워드는 GCC 컴파일러가 제공하는 확장기능임.
  • C표준은 아니고, window에서 사용하는 #pragma와 비슷하다고 볼 수 있음.
  • 임베디드를 주로하는 하다며보면 보게 되는데, 단어 그대로 "속성"지정 키워드임.
  • __attribute__는 다음과 같이 3가지로 구분됨.
    • 함수속성(Function attribute)
    • 변수속성(Variable attribute)
    • 타입속성(Type attribute)
  • GNU C에서 프로그램에서 불리워질 함수들에 대해 컴파일러에게 더욱 주의하여 최적화하고 검사하도록 선언할 수 있음.
  • __atribute__ 다음에는 쌍괄호로 싸여진 속성인자가 따라오는 형태임.

  • 아래 예제를 추가로 보자

__attribute__((__used__))

  • 컴파일러가 선언만 된 사용하지 않는 변수를 제거하지 않도록 하는 기능.
  • 변수를 선언해놓고 사용하지 않을때 발생하는 관련 warning를 발생시키지 않음.

__attribute__((__aligned__(x)))

  • 선언한 변수의 메모리주소를 x의 배수로 정렬.

example : __attribute__((__aligned__(sizeof(long))))
__attribute__((__packed__))

구조체 패딩을 예제로 보자.

//example.c
typedef struct {
	int a;
	char b;
} test;
  • 패딩 규칙에따라 컴파일러는 일반적으로 align 규칙에 의해 총 8Byte의 메모리를 할당함.
  • 하지만 변수 b는 1 byte만 사용함.
typedef struct {
	int a;
	char b;
} __attribute__((__packed__)) test;

위 코드와 같이 구조체 이름 앞에 __attribute__((__packed__)) 키워드를 사용하게 되면 컴파일러는 구조체의 실제 크기인 5byte를 할당해 사용하지 않는 메모리를 할당하지 않도록 할 수 있다.


여기서 중요한점은 32bit과 64bit에서 구조체 멤버 메모리 접근 위치가 달라질 수 있는데,
이를 해결하기 위해,
1. #pragma pack(push, n)을 이용해 컴파일러가 패딩 비트를 사용하지 않도록 한다.
2. 개발자가 직접 패딩 비트를 삽입한다.
3. 위와 같이 __attribute__((__packed__))키워드를 이용하는 방법이다.

참조 및 출처

profile
안녕하세요

0개의 댓글