[완료] 배열 스트링의 처리에 대한 질문이 있습니다.
글쓴이: xog2000 / 작성시간: 월, 2007/11/19 - 1:26오후
간단히 사용법을 물어보고자 하는 것이
아님을 미리 말씀드립니다.
저는 보통 프로그래밍시 배열로 된 스트링을 다음과 같이 처리합니다.
만일 char형 1024 배열에 "HELLO"등의 길이를 알 수 없는 문자열(original)이
넘어 온다면
//프로토타입
int function1(char *);
//함수 시작 후
char *string;
string = (char *)malloc(sizeof(char) * (strlen(original) + 1));
strcpy(string, original);
function1(string);
free(string);
// 함수 끝
이런 식으로 코딩을 합니다.
하지만 이런 식의 코딩도 가능할 것입니다.
char string[1024];
strcpy(string, original);
function1(string);
과연 어느것이 더욱 효율적인가요?
정말로 궁금해서 하는 질문입니다.
제가 하는 방식이 줄이 많기 때문에 더욱 느려 질 듯합니다.
하지만 배열의 크기 전체를 넘겨주는 것 역시
비효율적이라는 느낌이 듭니다.
물론 정답은 없을 듯합니다.
그냥 자신의 생각을 적어 주십시오.
제 코딩 스타일에 변화가 필요함을
느끼기에 이런 어처구니 없는 질문을 올렸습니다.
죄송합니다.
Forums:
편한대로 하시면 될듯한데요?
숫자를 그냥 적는 것이 편하다고 생각하시면 그렇게 하시면 되고, 꼭 계산해서 넣어야 할 상황이라면 계산하면 되지 않을까요?
모든 문제를 같은 방법으로 풀려고 하면 안됩니다. 각자 나름대로의 방법이 있는 것이죠.
코딩의 간편함을 따지자면 고정시키는 게 좋고, 메모리를 아껴야 한다면 계산해서 만드는게 좋겠지요.
어떤 식으로 쓰일 지 모른다면 그 프로그램을 짤 당시에 숫자를 그냥 적어서 고정시켜놨다가, 나중에 비효율적이라 생각하면 계산하도록 바꾸면 되겠죠.
소프트웨어는 soft해서 소프트웨어입니다.
덧. 저같으면 무조건 구조가 간편하고 소스코드가 적은 쪽을 선택합니다.
------------------------------
How many legs does a dog have?
------------------------------
How many legs does a dog have?
답변 감사드립니다.
답변 감사드립니다 :)
----------------------------------------
// 두뇌설정
memset((void *)&두뇌, 0x00, sizeof(두뇌));
든게 없구나..
----------------------------------------
내가사는세상-Kernelist : http://blog.naver.com/xog2000
"모르는 것은 어리석은 것이 아니다.
어리석은 것은 알려는 의지가 없음을 말한다."
궂이 복사할 이유가
궂이 복사할 이유가 있나요?
원본을 보존해야하고 함수1에서 원본을 건드리지 않는이상 그냥 바로씁니다..
포인터의 장점을 이용해야죠.
function1(original);
int function1(char *) / int
int function1(char *) / int function2(const char *) 를 구분해서 쓰면 명확하지 않을까요?
함수의 파라미터를 정확히 명시해주는게 함수의 내용을 작성할 때 좋을 듯 하네요.
char *로 넘어오면 마음대로 바꿀 수 있기 때문에 그냥 사용하여 바꾸면 되죠.
const char *로 넘어오면 수정이 불가능 하기 때문에 넘어온 내용을 사용하기 위해
복사하거나 하면 되겠죠? ㅡ.ㅡa
제가 묻고자 하는
제가 묻고자 하는 요지가 잘못 전달 된 듯 합니다.
저 부분은 프로그램의 단지 일부분을 축약한 것입니다.
제가 말씀 드리고자 한 것은
대형화된 시스템에서 과연 1024 배열을 다 넘기는 것이
그것을 "HELLO"만을 넘기는 것(더 많은 함수의 호출)보다
더 효율적인지 입니다.
메모리와 퍼포먼스 차이의 문제이겠군요.
제가 이 질문을 하고 나서도
바보 같긴 하군요.
프로그램 구성마나 틀릴 일인데..
----------------------------------------
// 두뇌설정
memset((void *)&두뇌, 0x00, sizeof(두뇌));
든게 없구나..
----------------------------------------
내가사는세상-Kernelist : http://blog.naver.com/xog2000
"모르는 것은 어리석은 것이 아니다.
어리석은 것은 알려는 의지가 없음을 말한다."
배열로 하던
배열로 하던 동적할당으로 하던
어차피 함수 내부로 넘어가는 것은 문자열에 대한 포인터 주소값, 즉 단지 4byte밖에 안됩니다.
여기서 함수 호출에 대한 성능 차이를 논한다는 것은 의미가 없습니다.
아무 차이가 없으니까요.
(설마 이걸 모르셔서 이런 글을 올리시지는 않으셨을 듯 하고)
차이점이라면 배열로 하는 것과 동적할당으로 하는 것 중 어느 쪽이 메모리 할당에 대한 오버헤드가 크냐 하는 문제죠.
근데 이걸 논하기 전에 우선 해당 문자열에서 수정이 이루어지냐 아니냐를 따질 필요가 있습니다.
수정이 이루어지지 않는다면 위에 분이 말씀한 대로 그냥 원본 그대로 넘겨받으면 되지 굳이 복사해서 넘길 필요가 없습니다.
하지만 그렇지 않은 걸로 봐서 반드시 문자열을 수정할 필요가 있는 듯 한데...
딱 문자열 길이만큼만 할당받아서 복사하는 걸로 봐서 문자열이 늘어나지는 않는 듯 하군요?
여기서 분기가 하나 생깁니다.
멀티 쓰레드에서 사용되는 함수가 아니라면 고정된 크기의 static char형 배열을 사용하는게 딱 한번의 할당만 이루어지므로 가장 싸게 먹히겠죠.
만약 멀티 쓰레드에서 사용되는 함수라면, 또다시 분기가 생기는데
배열로 하는가 동적할당으로 하는가 입니다.
코드의 의미상으로는 차이가 없지만
많은 컴파일러가 배열은 보통 스택에 그 공간을 잡고 malloc는 힙에 공간을 잡는 경향이 있는데
이건 너무 밑바닥의 얘기라 하드웨어 특성을 알아야만 결정할 수 있을 것 같군요.
댓글 달기