-
[C++] #pragma 란?C++ 2024. 6. 27. 16:20
Pragma
C 및 C++ 프로그래밍 언어에서 컴파일러에게 특정 지시사항을 전달하는 데 사용되는 전처리기 지시어
표준화되어 있지 않아서 코드의 안전성 이식성을 보장하기 위해선 #define 등으로 대체하기도 한다.
종류
1. #pragma once
헤더 파일이 여러 번 포함되는 것을 방지하는 pragma
#include된 폴더에 같은 헤더가 있으면 무시한다.
#pragma once #ifndef MY_HEADER_H #define MY_HEADER_H // 헤더 파일 내용 #endif // MY_HEADER_H
2. #pragma pack
구조체 멤버 배치를 제어하는 pragma
틀정 바이트 경계로 맞추게 한다.
메모리 사용을 최적화하거나 특정 메모리 레이아웃을 강제할 때 사용
#pragma pack(push, 1)
현재의 메모리 패킹 설정을 스택에 저장하고 새로운 패킹 설정을 지정.
'1'은 패킹 단위를 의미하고 구조체 멤버들이 1byte 경계로 정렬되도록 한다.
메모리 패킹이란?
구조체 멤버들이 메모리에 배치되는 방식을 제어하는 것
컴파일러는 일반적으로 멤버들을 특정 바이트 경꼐에 맞추어 배치하여 성능을 최적화한다.
대부분의 컴파일러는 구조체 멤버를 4bytes 또는 8bytes 경계에 맞추어 정렬한다.
ex) 4바이트 정수는 4바이트 경계에 맞추어 배치하는 것
아래의 코드는4bytes인 int에 맞추어 4bytes 단위로 패킹되었다.
#include <iostream> // 기본 패킹 설정 (컴파일러에 따라 다를 수 있음) struct DefaultPackedStruct { char a; // 1byte int b; // 4bytes short c; // 2bytes }; // 1바이트 패킹 설정 #pragma pack(push, 1) struct OneBytePackedStruct { char a; int b; short c; }; #pragma pack(pop) int main() { std::cout << "Size of DefaultPackedStruct: " << sizeof(DefaultPackedStruct) << std::endl; std::cout << "Size of OneBytePackedStruct: " << sizeof(OneBytePackedStruct) << std::endl; return 0; } // 출력값 // (a의 1byte + padding 3byte) + (b의 4bytes) + (c의 2bytes + padding 2bytes) // Size of DefaultPackedStruct: 12 // 1bytes + 4bytes + 2bytes -> 1byte 경계로 패킹되어 padding이 없음 // Size of OneBytePackedStruct: 7
#pack(pop)
이전에 스택에 저장한 패킹 설정을 복원하는 것
즉 #pack(psuh, n)에서 설정한 패킹 설정을 원래대로 되돌린다.
3. #pragma message
컴파일 도중 특정 메시지를 출력
디버깅이나 빌드 정보 출력을 위해 사용
#pragma message("Compiling " __FILE__)
'C++' 카테고리의 다른 글
[C++] __attribute__ 에 대해서 (0) 2024.06.27 [C++] Boost MSM(Meta State Machine) 이란? (0) 2024.05.24