보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.
heap 관련해서 공부를 진행도 해야되고...자료구조 전에 궁금한게 좀 있었다.
오늘은 malloc 과 calloc의 차이를 찾아보려고 한다. 사실 둘의 차이는 해당 heap 영역을 0으로 설정 해준다는 차이가 있는데... 그렇다면 malloc로 할당된 공간에 memset 으로 설정 하였을 상황과 calloc 으로 선언한 상황을 비교를 해보고자 한다.
malloc()
malloc 함수는 가변적으로 heap 공간에 할당을 하여 공간을 확보? 한다고 표현 하면 맞을꺼 같다. 가변적으로 말한건 특정 상황에서 input 으로 변해지는 공간을 확보 해야된다면 사용하기 적합하다고 필자의 생각이다. val[i] 로 선언이 된다면 말이 달라지지만 엌ㅋㅋ
1 2 | void *malloc(size_t size); int *ptr = malloc(10 * sizeof (int)); | cs |
1번 라인이 malloc의 원형이며. 2번 라인은 그에 따라 예시로 할당하였다.
calloc()
calloc 함수는 malloc과 유사하나 malloc은 할당과 동시에 초기화를 해주지 않는 반면 calloc은 NULL값으로 초기화를 해준다. 그리고 사용시 인자로 malloc은 (10*sizeof(int)) 처럼 할당할 전체 데이터의 크기가 들어가는 반면, calloc은 (10, sizeof(int)) 로써 첫 번째 인자로 몇 개를 할당할 것인지와 두 번째 인자로써 각 할당된 개수의 크기를 설정한다.
1 2 | void *calloc(size_t nelements, size_t bytes); int *ptr = calloc(10, sizeof (int)); | cs |
결론적으로 둘을 비교 하려면 calloc vs malloc + memset 구도로 봐야 될꺼 같다. 같은 의미의 함수로 생각이 들지만 무슨차이가 있을까?
그전에 궁금한것이 있다. calloc 함수에서 왜 인자를 두개를 받는 것 이다. 이에 관해서 검색 해보니 calloc은 두개의 인자를 받음으로써 overflow 여부를 확인할 수 있게 되어있다. 모든 calloc의 구현에서 이 사실이 유효한지는 알 수 없지만, malloc에서 많이 사용하는 곱셈은 분명 size_t를 넘어서는 메모리 할당이 발생할 경우 잘못된 메모리를 할당받을 수 밖에 없지만, calloc은 NULL을 return할 수 있을 것이다.
링크 :: https://stackoverflow.com/questions/4083916/two-arguments-to-calloc
그렇다면 둘중 어느 것이 더 효율이 있을까? 속도는 아마 calloc 의 승리일 것이다. OS가 0으로 초기화한 메모리 영역을 가지고 있을 수 있기 때문에 calloc시 그 영역을 바로 반환하는 것으로 처리될 수 있다고 한다. 이런 경우 모든 메모리 영역을 0으로 초기화해야 하는 memset보다 단연 빠를 수 있다는 결론을 낼 수 있다.
그치만 흥미로운것은 malloc을 자체를 두고 비교를 해본다면 calloc 보다 속도가 더 빠를것 이라 예상된다. OS는 유저가 malloc을 통해 메모리를 요청했다고 해서 반드시 실제 메모리를 잡아서 전달하는 것이 아닐 수 있다. 반면 calloc은 메모리를 잡고 초기화할 우려가 있다.
링크 :: http://stackoverflow.com/questions/2688466/why-mallocmemset-slower-than-calloc
링크 :: http://stackoverflow.com/questions/3449031/c-calloc-v-malloc
결론은 뭐가 더 좋냐... malloc 가 더 좋다고 생각한다. 아래 링크를 참고 해보면 정확한 이유를 알 수 있지만, 영역에 내용을 쓰는게 아닐것인가...사실 이런 글도 의미가 없을 꺼 같긴하다. 내용을 넣기 위한 공간 할당인데 초기화를 하고 넣는다니...
조금 집고 넘어가자면 calloc이 하는 0으로 초기화란, 단순히 비트 클리어의 역활일 뿐이라는 점이라는 것인거 같다.
링크 :: http://wiki.answers.com/Q/Is_it_better_to_use_malloc_or_calloc_to_allocate_memory
C/C++ 제곱근 SQRT (0) | 2017.10.19 |
---|---|
C/C++ int main, void main (0) | 2017.10.18 |
C/C++ string in switch/case (0) | 2017.10.18 |
python z3 (0) | 2017.07.24 |
python subprocess (0) | 2017.07.10 |
제곱근 구하는 함수를 처음 봤는데 구글에 검색하자마자 바로 눈에 보인건 구현 이였다.
그래서 나도 따라해본다(?)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> double SQRT(double input, double x){ for(int i=0; i<10; i++){ x = (x + (input / x)) / 2 ; } return x ; } double SQRT(double, double); void main() { double input, x, result; while(1) { scanf("%lf", &input); scanf("%lf", &x); result = SQRT(input, x); printf("SQRT num : %lf", result); } } | cs |
SQRT 를 구현한 C 코드이다. 검색 해보니깐 제곱근을 구하는 알고리즘으로 바빌로니아 법 이라는 것을 찾을 수 있었다.
x = (x + (A / x)) / 2
가 주된 결론인데. A는 제곱근을 구하고자 입력되는 값이고 x 는 0~ a 사이에 존재하는 임의의 값이다. 수식을 원하는 근사치가 나올때까지 반복 루프 돌리게 되는데, 루프를 많이 돌릴수록제곱근의 정확도가 높아진다.
이외에도 진짜 많은 자료가 있는데... 쓰면서 참고자료 링크 걸려다 보니깐 먼가 뻘짓한 기분도 들기도 하고...
링크 :: https://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
C/C++ calloc vs malloc+memset (0) | 2017.10.20 |
---|---|
C/C++ int main, void main (0) | 2017.10.18 |
C/C++ string in switch/case (0) | 2017.10.18 |
python z3 (0) | 2017.07.24 |
python subprocess (0) | 2017.07.10 |