참조


[참조 요약]
LocalAlloc(), GlobalAlloc()
: win16의 잔재. HeapAlloc 보다 느리고 적은 기능.
HeapAlloc()
: 10kb 까진 VirtualAlloc() 보다 빠르며 malloc, new의 segmentation 회피 가능.
VirtualAlloc()
: 가상 메모리 할당받아 페이지 단위로 메모리 조작.
 대용량의 공간 필요시 사용



VirtualAlloc
메모리에 대한 예약 상태 및 액세스 권한 지정이 가능. 
malloc이나 realloc의 메모리 단편화를 극복할 수 있으며 대용량의 메모리가 필요한 경우 유용하다.
보통 시스템 페이지 사이즈(보통 4KB) 단위로 할당된다.

[Overview]
VirtualAlloc() : 가상 메모리 할당
VirtualFree() : 가상 메모리 할당 해제
VirtualProtect(): 접근 권한 변경
VirtualQuery() : 지정한 주소의 페이지 정보 얻기
VirtualLock() : 특정 주소에 특정 길이만큼 메모리 페이지를 잠그며 
잠긴 영역의 데이터는 페이징 파일로 보내지 않고 항상 RAM에 남아있게 된다.
VirtualUnlock() : 데이터가 페이징 파일로 이동할 수 있도록 잠금을 해제한다.

[VirtualAlloc()]
예약(MEM_RESERVE), 확정(MEM_COMMIT) 할당방법 제공. (예약은 64KM 블록 단위로 처리됨)
MEM_RESERVE : 물리적 메모리 확정 없이 주소 공간만 예약
MEM_COMMIT : 물리적 메모리 확정 (실제 사용을 위해 필요)
MEM_TOPDOWN : 가급적 높은 번지의 메모리 할당(NT 이상)
MEM_FREE : 사용할 수 있는 자유 영역
예약과 확정을 동시에 요청할 경우 MEM_RESERVE | MEM_COMMIT 사용
할당 번지(1번쨰 인자)는 할당 단위의 배수가 되는 번지로 내림하여 할당.
NULL시 알아서 적당한 번지를 돌려줌
할당 영역(2번째 인자)은 페이지 단위의 배수 (대부분의 페이지 크기는 4K)
[VirtualFree()]
MEM_DECOMMIT: 확정(MEM_COMMIT) 해제
MEM_RELEASE : 예약(MEM_RESERVE) 해제
[메모리 보호 속성(Memory Protection Constants)]
PAGE_EXECUTE : 실행 가능 (read, write 불가)
PAGE_EXECUTE_READ : 실행, 읽기 가능
PAGE_EXECUTE_READWRITE : 실행, 읽기, 쓰기 가능
PAGE_NOACCESS : 읽기, 쓰기, 실행 금지 (모든 액세스 금지)
PAGE_NOCACHE : 캐시 금지. (시스템 SW에서 사용)
PAGE_READONLY : 읽기 가능
PAGE_READWRITE : 읽기, 쓰기 가능
PAGE_GUARD : 보호 페이지 지정(주로 메모리 끝을 표시하는 용도). 
 이 페이지에 읽기, 쓰기 시도시 STATUS_GUARD_PAGE 예외 발생 후 보호 페이지 상태 해제
PAGE_EXECUTE_WRITECOPY : 공유 영역에 쓰기시 사본을 작성함.
PAGE_WRITECOPY
PAGE_WRITECOMBINE :
**. 실행은 해당 메모리의 코드를 CPU가 실행할 수 있다는 뜻으로 아직까진 읽기와 같은 뜻으로 쓰인다.

[샘플]


HeapAlloc
가상 메모리 공간의 예약된 영역 사용
작은 메모리 블록을 할당하여 사용할때 VirtualAlloc보다 유리하다.
ex) 4byte 크기로 10000번 메모리 할당할 경우
VirtualAlloc은 40MB 가상메모리와 660MB 주소공간을 사용
(한번에 할당시 4KB(페이지 사이즈) + 주소공간 64KB)
HeapAlloc은 40KB만 사용하게 된다.
**.Default Heap : 프로세스 생성시 OS가 기본적으로 할당하는 1MB의 힙

[Overview]
GetProcessHeap() : Default Heap의 핸들을 반환한다.
HeapCreate() : Heap 생성
HeapAlloc() : Heap 에 메모리 할당
HeapFree() : Heap 의 메모리 해제
HeapDestroy() : Heap 해제 (HeapFree로 일일이 해제할 필요 없음)
HeapLock() : 현재 스레드가 Heap에 대한 독점적인 소유를 얻음
HeapUnlock() : 다른 스레드가 사용할 수 있도록 락 해제
HeapReAlloc() : Heap 크기 재할당
HeapSize() : Heap 크기를 구함
HeapCompact() : Heap 영역에 대한 조각모음
HeapValidate() : 유효한 블록인지 검사
HeapWalk() : Heap의 모든 블록 열거(잘못된 블록을 탐색하거나 디버깅시 유용)
**.Heap 할당 방식 지정 flag (보통 0으로 어떤 옵션도 사용하지 않음)
HEAP_GENERATE_EXCEPTIONS : 에러 발생시 NULL 리턴 대신 예회 발생
HEAP_NO_SERIALIZE : Heap사용에 대해 스레드 동기화를 하지 않음
(단일 스레드일때 빠른 속도를 위해 사용할 수 있지만 안정성을 위해 사용은 비권장 됨)
HEAP_ZERO_MEMORY : 할당한 HEAP을 0값으로 초기화

ex)
//옵션은 0, 4096 byte만큼 초기화 하며 1MB(1048576)까지 사용 가능
//1048576대신 0이면 무제한을 의미한다.
HANDLE TestHeap = HeapCreate(0, 4096, 1048576); 
int* ptr = (int*)HeapAlloc(TestHeap, 0, sizeof(int)*10); //40 byte 할당
for (int i=0; i<10; i++) ptr[i] = i*2;
HeapFree(TestHeap, 0, ptr); //메모리 해제
HeapDestroy(TestHeap);



GlobalAlloc/LocalAlloc
Win16에서 사용되던 함수로 Win32는 전역힙, 지역힙의 구분이 없기 때문에 동일하게 동작한다.
보통 GlobalAlloc이 사용된다.
GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree, GlobalReAlloc 함수들이 있다.
[GlobalAlloc() 의 flag 인자]
GMEM_FIXED : 메모리 할당 후 리턴된 포인터를 바로 캐스팅해 사용 가능
GMEM_MOVEABLE: OS가 효율적인 메모리 관리를 위해 메모리 이동을 허가해주며 포인터대신
  메모리 핸들을 리턴.
GMEM_ZEROINIT: 할당된 메모리를 0으로 초기화
GPTR : GMEM_FIXED | GMEM_ZEROINIT
GHND : GMEM_MOVEABLEL | GMEM_ZEROINIT
**.GMEM_MOVEABLE 사용시 GlobalLock을 통해 메모리 이동을 정지시키고 포인터로의 조작이 가능
포인터로 작업이 끝나면 GlobalUnlock으로 다시 OS가 효율적인 관리를 위한 메모리 이동을 허가해준다.

ex) GMEM_MOVEABLE 형식의 사용
hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(int)*10);
ptr = (int*)GlobalLock(hMem);
for (int i=0; i<10; i++) ptr[i] = i*2;
GlobalUnlock(hMem);
GlobalFree(hMem);

ex) GMEM_FIXED 형식의 사용
ptr = (int*)GlobalAlloc(GMEM_FIXED, sizeof(int)*10);
for (int i=0; i<10; i++) ptr[i] = i*2;
GlobalFree(hMem);

 

퍼옴 :yamoe.tistory.com/208 

ui->centralWidget->setFixedSize


(width, height); layout()->setSizeConstraint(QLayout::SetFixedSize);
mainwindow.cpp 에서 사용한다.




Class와 include의 차이점
 
1. class로 선언하는 것은 파일을 포함하지 않고, 해당 파일을 사용할 것이라는 선언만 해준다.
   Include로 선언하는 것은 해당파일을 그대로 복사해서 포함시킨다.
 
2. class로 선언하는 경우, 파일이 중복포함되는 것을 방지해준다.
   (include가 한번이상 되는 것을 방지)
 
3. 2번과 같은 이유로 인하여, 컴파일 시간이 현저하게 줄어들 수 있다.
   (쓸데없이 똑 같은 파일을 한번이상 컴파일 하지 않으므로)
 
4. 사용시, 객체를 선언하려면 반드시 include를 해주어야 한다. 왜냐면, 해당 객체를 크기를 알아야 하기 때문이다. 포인터로 선언하려면 class를 사용해주면 된다. 대신 cpp파일에서 해당파일을 include해준다.
 
5. 선언이 미처 끝나지 않은 두 클래스간의 상호참조는 class를 사용한다. 



dlg.h


CNewDlg* pDlg;


dlg.cpp


OnInitDialog{

...

pDlg = new CNewDlg();

pDlg->Create(IDD_DIALOG_ID);

...

}


새로운 창을 뛰울 버튼 클릭함수{

...

pDlg->ShowWindow(SW_SHOW);

...

}



NewDlg.cpp


새로운 창을 닫을 버튼 클릭 함수{

...

pDlg->ShowWindow(SW_HIDE);

...

}






/////////


새로운 다이얼로그를 닫는 과정에서 죽어버려서 방법을 바꿈.


초기에 만들어 놓고 보였다, 안보였다 하는 방식이다.

어느날 다이얼로그만 구성해서 디버깅하는데 실행조차 안돼는 것이다.


 The program '[4308] SerialInputDemo.exe: Native' has exited with code 0 (0x0).


뭘까 해서 한참 삽질하다보니 , 원인은 rich edit 2.0  이놈.


이놈을 사용하기 위해서는 AfxInitRichEdit();  혹은 AfxInitRichEdit2(); 을 써줘야한다


둘의 차이점은 모르겠지만,,, InitInstance()에 넣어주니 깔끔히 실행되는 것을 확인!




CDP_MP3_BASIC.exe



설명을 하면서 만들어야되는데

귀찮아서 일단 막 만들어버렸다..


다음엔 만드는 방법을 설명해보겠다...


























Monday, February 04, 2008

숫자 진법 변환기입니다. 아래의 색깔 있는 입력 칸들 중의 아무 칸에나 해당되는 진법의 정수 숫자를 입력하면, 즉시 다른 진법으로 자동 변환됩니다. 진법의 중요도 순으로, 10진수, 16진수, 2진수, 8진수를 지원합니다. 프로그래밍 등에서 16진수가 많이 사용되고, 비트 연산 등에서는 2진수도 사용됩니다. 8진수는 별로 사용되지 않는 진법입니다.


10진수:   Dec
16진수:   Hex
 2진수:   Bin
 8진수:   Oct

  문자:  ASCII / Unicode Char


메시지: 


그 숫자에 해당하는 문자 코드의 문자 1개도 출력됩니다. 예를 들어 10진수 65를 입력하면, 대문자 A가 출력됩니다. 대문자 A의 아스키 코드가 10진수로 65번이기 때문입니다. 거꾸로, "문자" 입력 칸에 A를 입력하면 각각의 숫자 칸들에 10진수 65에 해당하는 숫자들이 출력됩니다. 한글은 아스키 코드가 아닌, 유니코드로 처리됩니다. 예를 들어, 한글 낱자 의 유니코드 번호는 16진수 헥사로 AC00 입니다.

색깔 있는 입력 칸들의 우측 끝에 있는 하얀 칸들은, 그 숫자들의 자릿수를 표시합니다. 예를 들어 2진수 11111111 은 8개의 숫자로 되어 있기에 8로 나옵니다.

위의 계산기는 입력한 숫자들을 "부호 없는 32비트 정수 (unsigned int)"로 간주합니다. unsigned int의 최대값은 10진수로 4294967295이고, 16진수로는 FFFFFFFF입니다. 2진수로는
11111111111111111111111111111111
입니다. 따라서 이보다 더 큰 숫자를 입력하면 정밀도를 잃을 수 있습니다.

주의: 음수(Negative Number)는, 위의 계산기로 변환할 수 없습니다.

+ Recent posts