const 프로그래밍

1. const int* n : n이 가르키는 대상체의 상수화(Pointer to constant)
n++; // n 자체의 변경 가능
*n = 0; // n이 가르키는 값의 변경 불가능

2. int* const n : 포인터 n의 상수화(Constant pointer)
n++; // n이 상수이므로 불가능
*n = 0; // n이 가르키는 값의 변경 가능

3. const int* const n :  포인터와 대상체 모두 상수화
n++; // 불가능
*n = 0; // 불가능

크롬 시크릿 바로가기 주절주절

속성 대상 끝에  --incognito 추가

C:\Users\msi\AppData\Local\Google\Chrome\Application\chrome.exe --incognito

GBAA(Geometry Buffer Anti-Aliasing) 게임 개발

GBAA는 GPAA와 비슷하다. GPAA는 Post-process로 가장자리를 처리하지만 GBAA는 혼합된 방식을 사용한다. 렌더링을 하는 동한 기하학 정보를 별도의 버퍼에 저장하여 사용하는 방식이다.

GBAA가 GPAA보다 좋은 점은 별도의 GPU 코스트 없이 구현할 수 있다.

대악사 실행 게임 이야기

돌아다니는 파일 중에 한윈에 설치하기 편하게 디스크1의 파일명을 영문으로 바꾼 것이 있다. 문제는 설정 파일 안에서는 디스크2의 파일명을 영문으로 바꿨지만 실제 디스크2 안의 파일명은 바꾸지 않아 디스크2 삽입 에러가 해결이 되지 않는 다는 것이다. 이를 해결하려면 직접 파일명을 일치 시킨 후 다시 이미지 파일로 만들어야 한다.
 하지만 귀찮으니 변경되지 않는 이미지를 사용하는 것이 낫다. 게임을 실행 후 옵션에서 CD재생 드라이브 지정 후 디스크2를 넣고 게임을 다시 실행한다. 이 때 동영상과 배경음이 나온다면 디스크2 에러가 발생하지 않는다. 그래도 안된다면 게임을 진행해서 배경음이 나오는지 확인한다.

로마의 노예 주절주절

로마인은 노예를 이렇게 정의하고 있었다고 한다. "노예는 자신의 운명을 스스로 결정할 권리가 없는자" 
- 로마인 이야기

... 주절주절

수연낙명

MBCS와 WBCS 지원 windows 프로그래밍 프로그래밍

TCHAR
_T()
_t... 함수 사용.

unigine 엔진 게임 개발


__declspec 실제 사용 예 프로그래밍

class __declspec( align( 16 ) ) UnitManager
{
public:
    UnitManager( void );
    ~UnitManager( void );
.
.

struct __declspec( align( 16 ) ) UnitPositionData
    {
        float fPositionX[ gs_nSIMDWidth ];
        float fPositionY[ gs_nSIMDWidth ];
    };


__declspec 확장된 속성 구문 프로그래밍

http://blog.naver.com/kyuniitale/40021407522

Microsoft Specific

align(#)

    사용자정의 데이터를 정밀하게 정렬하는데 사용되며, 더불어 자주 사용되는 데이터를 특정 프로세서의 캐시라인 크기로 정렬해 캐시성능을 높인다. #은 정렬값으로 1부터 8192 (바이트) 까지 2의 거듭제곱 수. 즉 2, 4, 8, 16, 32, 64.

Visual C++은 기본적으로 데이터 크기에 따라 natural boundary에 데이터를 정렬한다. 가령 4바이트 정수는 4바이트 경계, 8바이트 더블은 8바이트 경계에 정렬되며, 클래스 또는 구조체내 데이터들은 natural alignment와 현재 packing 설정 (#pragma pack(n)또는 /Zp 컴파일러 옵션) 중 작은 값으로 클래스 또는 구조체 안에 정렬된다. 이 구문은 structunionclass 정의나 변수 선언시 사용할 수 있지만, 함수 매개변수 (즉 스택변수) 에는 사용할 수 없다.

 

참고  특정 타입의 기본 정렬값(size_t)을 알려면 __alignof(CE3.0), 64비트 프로세서를 타겟으로 할 때 정렬되지 않은 포인터를 선언하려면 __unaligned(CE5.0) 참조.

 

요약하자면:

  - __declspec(align(#))이 사용되지 않으면, 스칼라 구조체 멤버의 정렬값은 멤버 크기와

    현재 packing 중 작은 값이며, 구조체의 정렬값은 각 멤버 정렬값 중 가장 큰 값

  - 구조체 멤버는 구조체 시작 오프셋에서 이전 멤버의 끝 오프셋까지보다 크거나 같은 가장 작은

    정렬 배수값에 위치한다.

  - 구조체 크기는 마지막 멤버의 끝 오프셋보다 크거나 같은 가장 작은 정렬 배수값이다.

 

#define CACHE_LINE      32

#define CACHE_ALIGN    __declspec(align(CACHE_LINE))

 

struct CACHE_ALIGN S1

{                                      // 이 타입의 모든 인스턴스는 32바이트 경계에서 시작해야 하며,

    int a, b, c, d;                // S1을 구성요소로 가지는 구조체의 최소 정렬 속성은 32.

};                                    // sizeof(struct S1)는 32. 뒤따르는 16바이트가 padding

 

베이스가 올바르게 정렬된 배열을 만들려면, _aligned_malloc(VC.NET) 또는 자신의 할당자를 작성하도록 한다. malloc(VC6), C++ 연산자 new(VC.NET), Win32 할당자 같은 보통 할당자는 십중팔구 __declspec(align(#)) 구조체 또는 구조체 배열에 맞게 충분히 정렬되지 않을 메모리를 리턴한다.

 

구조체의 sizeof 값은 "가장 큰 멤버 정렬값의 가장 가까운 배수로 채워지는 마지막 멤버의 오프셋 + 마지막 멤버의 크기" vs. "완전한 구조체 정렬값" 중 큰 값이다.

 

__declspec(align(8)) struct S2 {

    int a, b, c, d;               // sizeof(struct S2)는 16

};

 

struct S3 {

    int a;                          // 4바이트 뒤를 잇는 28 바이트가 padding,

    struct S1 s1;              // s1은 오프셋 32에서 시작. sizeof(struct S3)는 64

};

 

// 배열의 시작주소는 32바이트로 정렬되지만, 각 배열멤버는 그렇지 않다

// 즉 각 배열멤버의 sizeof 값은 __declspec(align( # ))의 영향을 받지 않는다

CACHE_ALIGN int array[128];

 

// 배열의 각 멤버를 정렬하는 코드의 예

typedef CACHE_ALIGN struct { int a; } S4;

S4 array[10];

 

// 구조체 자체를 정렬하는 것과 첫번째 요소를 정렬하는 건 동일하다

CACHE_ALIGN struct S5 {

    int a;

    int b;

};

struct S6 {

    CACHE_ALIGN int a;

                           int b;

};

// 즉 S5와 S6은 동일한 정렬, 할당, 크기를 갖는다

 

void fn() {                      // a, b, c, d의 시작주소 정렬은 각각 4, 1, 4, 1

    int a; char b; long c; char d[10];

}

 

메모리가 힙에 할당되었을 때의 정렬은 호출된 할당함수에 의존한다. 가령 malloc을 사용하면, 그 결과는 피연산자 크기에 따라 다르다. arg >= 8이면 8바이트, arg < 8이면 arg 이하의 2 제곱수에 정렬된다. 즉 malloc(7)을 사용하면, 4바이트 정렬된다.

 

__declspec(align(#))을 이용한 새로운 타입 정의

 

struct aType {int a; int b;};

typedef __declspec(align(32)) struct aType bType;

 

이제 aType과 bType은 같은 크기 (8 바이트) 지만, bType 변수들은 32바이트 정렬된다.

 

TLS(thread-local storage)내 데이터 정렬

    __declspec(align(#))으로 생성되고 이미지의 .tls 섹션에 놓인 TLS(스레드에 유일한 데이터 저장소)는 일반적인 정적데이터와 똑같이 정렬된다. OS는 .tls 섹션 크기만큼 데이터를 할당하고 .tls 섹션 정렬 속성을 고려해 TLS 데이터를 생성한다. 다음은 TLS에 정렬된 데이터를 놓는 다양한 방법들이다.

 

// TLS에 정렬된 정수 놓기

__declspec(thread) __declspec(align(32)) int a;

 

// 정렬된 구조체를 정의하고 구조체 타입의 변수를 TLS에 놓기

__declspec(thread) __declspec(align(32)) struct F1 { int a; int b; } a;

 

이터 packing과 정렬

 

/Zp 컴파일러 옵션과 pack pragma는 구조체와 union 멤버 데이터를 packing하는 효과가 있다. 다음은 /Zp 옵션과__declspec(align(#))을 같이 사용한 예와 다양한 /Zp (또는 #pragma pack) 조건에서 각 멤버의 오프셋이다.

 

struct S{                                //   변수              /Zp1    /Zp2   /Zp4    /Zp8

    char a;                               //   a                  0          0         0          0

    short b;                              //   b                  1          2         2          2

    double c;                            //   c                  3          4         4          4

    CACHE_ALIGN double d;    //   d                  32        32       32        32

    char e;                               //   e                  40        40       40        40

    double f;                            //   f                   41        42       44        48

};                                           //   sizeof(S)      64        64       64        64

 

세부사항은 /Zp (구조체 멤버 정렬)(VC.NET) 참조.

 

따라서 객체의 오프셋은 객체가 __declspec(align(#)) 속성을 갖지 않으면, 이전 객체의 오프셋과 현재 packing 설정에 따라 결정되며, 그렇지 않으면 이전 객체의 오프셋과 객체의 __declspec(align(#)) 값에 따라 결정된다.

End Microsoft Specific

 

원문: C++ Language Reference, __declspec, align(CE 3.0)

참조: Windows Data Alignment on IPF, x86, and x64


1 2 3 4 5 6 7 8 9