$bash

C/C++ calloc vs malloc+memset

0x0300 : Study/0x0304 : Programming

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

저작자 표시 비영리 변경 금지
신고

'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

C/C++ calloc vs malloc+memset  (0) 2017.10.20
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
NASM - LD 컴파일 후 실행  (0) 2017.05.13
GDG DevFest 요약?  (0) 2016.12.20

C/C++ 제곱근 SQRT

0x0300 : Study/0x0304 : Programming

제곱근 구하는 함수를 처음 봤는데 구글에 검색하자마자 바로 눈에 보인건 구현 이였다.

그래서 나도 따라해본다(?)


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(doubledouble);
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



저작자 표시 비영리 변경 금지
신고

'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

C/C++ calloc vs malloc+memset  (0) 2017.10.20
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
NASM - LD 컴파일 후 실행  (0) 2017.05.13
GDG DevFest 요약?  (0) 2016.12.20

C/C++ int main, void main

0x0300 : Study/0x0304 : Programming

보통 C에서 int main으로 선언되고 void main 같은 경우에는 잘못 된 표기라 말해주는데

이 이유가 햇갈린다... 암튼 잘못된 선언인데 그 이유를 알아보자.


1
2
3
int main(){
    return 0;
}
cs


보통의 main 선언문 이다. 마지막에 대부분 return 0; 를 선언 해주는데 이 역할은 main() 이 정상적 으로 종료 됨을 의미하는 exit(0) 를 호출한 후, 함수를 종료하게 되는 부분이다. 이는 gcc 로 컴파일 해서 gdb나 이것저것 컴파일을 해보면 볼 수 있는데. sp(stack pointer 맞나?) 에서 main 부분 마지막 줄인 ret을 하면 libc_start_main..(정확히 이름이 기억이 나진 않넹..) 으로 점프하고 exit를 호출 하게 되는것을 확인 할 수 있다.


이때 여기서 exit()의 파라미터인 status 값은 컴파일러 마다 약간 다르게 설정되 있는데 일반적으로 0면 정상종료를 의미한다. 숫자의 의미는 각각의 에러 타입을 의미한다. 


int main()으로 하지 않고 void main() 으로 한다면 컴파일러가 컴파일 에러를 발생시키지 않아도 프로세스 상에서는 종료조건을 지정해 주지 않았기 때문에 main()함수에서 올바르지 않은 종료조건을 운영체제에 리턴하고 자신을 종료할 가능성이 있게 되어 오류가 생길 수도 있게 된다.

저작자 표시 비영리 변경 금지
신고

'0x0300 : Study > 0x0304 : Programming' 카테고리의 다른 글

C/C++ calloc vs malloc+memset  (0) 2017.10.20
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
NASM - LD 컴파일 후 실행  (0) 2017.05.13
GDG DevFest 요약?  (0) 2016.12.20