반응형


__attribute__((packed))는 C 또는 C++ 프로그래밍에서 사용되는 어트리뷰트(Attribute) 중 하나인데요.

__attribute__((packed))는 구조체 또는 클래스의 멤버들을 패킹하여 패딩을 추가하지 않도록 지시하는데 사용됩니다

 

__attribute__((packed)) 의 필요성

먼저 패킹의 필요성을 설명드리면, 실제로 구조체나 클래스의 멤버들은 일반적으로 정렬을 위해 패딩(padding)이 추가됩니다. 이는 데이터의 접근 속도를 높이기 위해 메모리의 정렬을 향상시키는데 사용됩니다. 하지만 때로는 구조체나 클래스의 크기를 최소화하거나, 특정 메모리 구조를 유지해야 할 때 패킹이 필요합니다.

__attribute__((packed))를 사용하면 컴파일러는 패딩을 추가하지 않고 구조체나 클래스를 정의할 수 있습니다.

이는 각 멤버가 메모리에서 연속적으로 배치되도록 보장합니다. 그러나 이렇게 패킹된 구조체를 사용할 때에는 성능상의 이슈나 정렬에 의한 성능 저하에 대한 고려가 필요합니다.


다음은 __attribute__((packed))를 사용한 예시입니다.

#include <stdio.h>

struct Example {
    char a;
    int b;
    char c;
} __attribute__((packed));

int main() {
    printf("Size of struct Example: %lu\n", sizeof(struct Example));
    return 0;
}

 

위 코드에서 __attribute__((packed))는 구조체 Example의 멤버들을 패킹하도록 지시합니다. 따라서 구조체의 크기는 멤버들의 크기의 합과 같아지며, 패딩은 추가되지 않습니다.

 

 

__attribute__((packed))을 적용한 것과 차이점

struct  
{ 
   char *s;
   char c; 
   long l; 
}S;        
 
struct __attribute__ ((__packed__)) 
{ 
   char *s;        // 4
   char c;         // 1
   long l;         // 4
}S_packed; 
 
int main() 
{ 
    printf("Size of S: %d\n", sizeof(struct S)); 
    printf("Size of S_packed: %d\n", sizeof(struct S_packed)); 
    return 0; 
}

참고자료: https://www.quora.com/What-is-the-attribute__-packed-variable-attribute-in-C-and-why-and-how-is-it-used

 

64비트 리눅스에서 출력화면

Size of struct S = 24 bytes

Size of struct S_packed = 17 bytes

 

 

 

C/C++에서 어트리뷰트(Attribute)란?

 

C/C++에서 어트리뷰트(Attribute)는 컴파일러에게 특정 속성이나 동작을 지정하는 데 사용되는 주석과 비슷한 것입니다. 이는 코드에 추가되어 특정 변수, 함수, 혹은 구조체 등에 대한 추가 정보를 제공하거나, 컴파일러에게 특정한 동작을 요청할 때 사용됩니다.

어트리뷰트는 컴파일러마다 지원되는 방식이나 문법이 조금씩 다를 수 있습니다. 예를 들어, GCC와 Clang에서는 __attribute__((...)) 문법을 사용하고, Visual C++에서는 [[...]] 문법을 사용합니다. 이러한 어트리뷰트는 보통 컴파일러에게 최적화, 경고 제어, 메모리 정렬, 패킹, 함수 인터페이스 지정 등과 같은 추가 정보를 제공합니다.

일반적으로 어트리뷰트는 다음과 같은 용도로 사용됩니다:

  1. 최적화 힌트 제공: 컴파일러에게 최적화를 수행할 때 특정 함수나 루프에 대해 힌트를 제공합니다.
  2. 경고 제어: 컴파일러 경고 메시지를 무시하거나 특정 경고를 활성화 또는 비활성화합니다.
  3. 메모리 관리: 변수나 구조체의 메모리 정렬, 패킹을 지정합니다.
  4. 함수 인터페이스 지정: 함수의 반환값, 매개변수, 호출 규약 등을 지정합니다.
  5. 기타: 사용하는 컴파일러에 따라 다양한 용도로 사용될 수 있습니다.

어트리뷰트는 코드의 가독성을 향상시키고, 컴파일러에게 추가 정보를 제공하여 성능을 최적화하거나 컴파일 시 발생할 수 있는 문제를 방지하는 데 도움이 됩니다.

반응형