C 언어를 다룰 때 필요한 마인드 : 나는 기계를 제어하는 중이다. 진짜 멍청한 기계다.



정적할당은 해제할 필요가 없고 일반적으로 할당 속도가 더 빠르다.

동적할당은 메모리 오버플로우 문제가 발생할 수 있고, 메모리가 연속적으로 할당되지 않을 수 있어 메모리 엑세스 속도가 느릴 수 있다. 따라서 new , delete 방식의 동적할당을 쓰지말고 vector를 써라.(vector를 1차원)

그러면 heap corrupt 문제가 발생하지 않고, 메모리 연속성을 보장 받을 수 있다.


- 2차원 배열 동적 할당 : new , delete

float ** parray = new float*[sizeOfColumn];
for(int i=0; i< sizeOfColumn; i++){
    parray[0] = new float[sizeOfRow
];
    memset(parray[0], 0, sizeof(float)*sizeOfRow); // memset을 이용해 쉽게 배열값을 0으로 초기화
}

for(int i=0; i< sizeOfColumn; i++){
    delete [] parray[i]; // 먼저 각 row를 초기화하고
}
delete [] parray; // column을 초기화

enter image description here


또한 C++11 부터는 다음과 같은 선언도 가능
(C++11 은 기존 C++98에서 기능이 확장된 것으로, visual studio 2010부터 서서히 구현되는 중이다.)

auto array = new double[X][Y]; 

http://msdn.microsoft.com/ko-kr/library/hh567368.aspx


- 1차원 배열을 동적할당 한다음 2차원 배열처럼 쓰기

int *ary = new int[sizeX*sizeY];
//ary[i][j] is then rewritten as 
ary[i*sizeY+j]


- 가장 좋은 방법 : Vector로 1차원 배열을 할당한 다음 2차원 배열처럼 쓰기

vector<float> *targetdatamatrix;
vector<float> tmp_weightmatrix(X*Y , 0.1);
weightmatrix = &tmp_weightmatrix;

for(int i=0; i < X ; i++){
for(int j=0; j < Y ; j++){
(*weightmatrix)[i*X+j] = 0.1f;
}
}



http://felixblog.tistory.com/72
http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new

http://wwww7.com/bbs/skin/ggambo6210_board/print.php?id=Study&no=71



'프로그래밍 > 프로그래밍 팁' 카테고리의 다른 글

Numpy 문법, API, 환경설정 / HDF5를 위한 H5PY API  (0) 2015.12.01
ubuntu 설치 usb 만들기  (0) 2015.08.28
C++ STL의 Vector 사용법  (0) 2014.12.04
C++ 프로그래밍  (0) 2014.11.26
Visual Studio  (0) 2014.11.24
Ubuntu - Screen , zip, tar 사용법  (0) 2014.07.07
by 곽동현 이스텔리앙 2014.12.04 16:35
| 1 2 3 4 5 6 7 8 9 10 ··· 14 |