#include <stdio.h>
__attribute__((constructor)) static void _bar() { printf("bar\n"); } // A ?
struct Foo { Foo() { printf("foo\n"); } }; // B ?
static Foo foo;
int main() // C ?
{
printf("main\n");
return 0;
}
수행 결과는 'B'->'A'->'C'의 순서로 함수 호출이 이루어짐을 확인하였다.
이와 관련된 글을 찾아보니 __attribute__((constructor))로 선언된 함수는 Standard C++가 아닌 GCC extension 기능 중 하나이고
GCC 구현사항에 의존한다고 한다.
http://stackoverflow.com/questions/8433484/c-static-initialization-vs-attribute-constructor
2016년 9월 18일 일요일
attribute 함수 선언 - Declaring attributes of functions
얼마전 진행중인 프로젝트 코드에서 __attribute__ 로 선언된 함수에 관련된 문제가 발생하였다.
개괄적인 문제 내용은 해당 함수 선언으로 인해 실행 이미지 크기가 기존 대비 5M 증가하는 문제였다. (기존 이미지 크기 대비 50% 증가)
이 글에서는 프로젝트 문제 분석이 아닌 Attribute 함수에 대한 개괄적인 내용을 정리하겠다.
GNU 공식 site에서 소개하는 attribute 함수의 상세내역은 아래를 참조한다.
https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
해당 본문을 살펴보면 Attribute 함수는 일반적 동작 보다는 특별한 목적을 위해 사용하는 것임을 확인할 수 있다.
Attribute 함수는 사용하는 목적에 따라 다양한 매개변수를 취할 수 있다.
그 중에서 Application SW에서 사용빈도가 높은 매개변수는 constructor 정도가 아닐까한다.
constructor 매개변수를 사용할 경우 아래의 설명에서 확인하듯이 main 함수 호출 이전에 해당 함수 호출이 가능하다.
- destructor 매개변수 사용시 main 함수 완료 후 또는 exit 함수 호출 후 해당 함수가 호출된다.
이와는 별도로 static 객체의 경우도 main 함수 호출 이전에 해당 객체의 초기화가 이루어지기 때문에
__attribute__((constructor)) 선언된 함수와 비슷한 동작이 가능하다.
그렇다면 아래의 코드에서 먼저 호출되는 함수는 무엇일까 ?
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기