Tuesday, July 14, 2015

static function, variable, member function

1) static function : 정적함수
참조 : http://stackoverflow.com/questions/558122/what-is-a-static-function
c문법. 함수 정의의 스코프를 해당 파일(.c, .cpp)에 제한한다. 파일을 다른표현으로 모듈이라고 부르기도 한다. 예를 들어 다음 파일들을 컴파일 할 경우,.

// a.c
void f(){
    printf("a.c : f()\n");
}
void func_a(){
    for(int i = 0; i < 4; i++)
        f();
}
// b.c
void f(){
    printf("b.c : f()\n");
}
void func_b(){
    for(int i = 0; i < 4; i++)
        f();
}

함수 void f()가 이미 선언된 함수를 제정의한다고 link time error를 일으킬 것이다. 이를 피하기 위해 static 함수를 선언하는것이 일반적이며, 다른 모듈(파일)에서 호출하도록 허용할 경우에는 일반함수로, 함수 원형 선언을 헤더파일에서 실시한다.
 
// a.h
#ifndef A_H_
#define A_H_  // inclusion guard

void func_a();

#endif
 
// b.h
#ifndef B_H_
#define B_H_

void func_b();

#endif
// a.c
static void f(){ // no more link time error
    printf("a.c : f()\n");
}
void func_a(){
    for(int i = 0; i < 4; i++)
        f();
}
// b.c
static void f(){
    printf("b.c : f()\n");
}
void func_b(){
    for(int i = 0; i < 4; i++)
        f();
}
 
// main.c
#include "a.h"
#include "b.h"
void main(){
    func_a();
    func_b();
}

inclusion guard에 대한 설명은 다음기회에.

2) static variable
 지역변수는 함수의 함수가 종료(return)될 때 파괴된다. 그러나 정적변수(static variable)은 함수가 종료되어도 파괴되지 않고 그 값을 유지해, 다음 호출에서 활용할 수 있다.
 google style guide에서는 전역변수와 더불어 정적변수를 예외적인 경우를 제외하고는 기본적으로 금지하고 있다.#
 본인도 메모리 할당, 해제에 의한 성능저하 방지를 위해, 프로파일에 근거해 병목지점인 경우에만 한해서 써본것 외에 많이쓰지 않으며, 이마저도 멀티쓰레드 코딩으로 변경하는 과정에서 다시 병목지점이 되는 문제가 발생해, 결국 정적변수를 없에고, 다른 방법으로 문제를 처리한 경험이 있다.

3) static member function, static member variable
정적변수, 정적함수와는 전혀 다른 문법이다. 싱글턴 패턴구현에도 사용되는 문법.

http://soen.kr/lecture/ccpp/cpp3/27-3-2.htm
http://soen.kr/lecture/ccpp/cpp3/27-3-3.htm

인스턴스의 구현 없이 호출, 초기화가 가능한 장점이 있으며, 각 인스턴스에서도 접근이 가능하다.
예를 들면,
 a) 생성자를 private으로 접근을 제한한 다음, 정의된 정적 멤버 함수를 거쳐서만 생성자가 호출되게 하므로써 싱글턴 패턴이 구현 가능하며,
 b) 또는 생성자 및 파괴자의 매 호출마다 정적 변수 number_of_instance 를 업데이트해, 이를 관리하는식으로 활용할 수 도 있다.

No comments:

Post a Comment