[완료] 배열 스트링의 처리에 대한 질문이 있습니다.

xog2000의 이미지

간단히 사용법을 물어보고자 하는 것이

아님을 미리 말씀드립니다.

저는 보통 프로그래밍시 배열로 된 스트링을 다음과 같이 처리합니다.

만일 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);

과연 어느것이 더욱 효율적인가요?

정말로 궁금해서 하는 질문입니다.

제가 하는 방식이 줄이 많기 때문에 더욱 느려 질 듯합니다.

하지만 배열의 크기 전체를 넘겨주는 것 역시

비효율적이라는 느낌이 듭니다.

물론 정답은 없을 듯합니다.

그냥 자신의 생각을 적어 주십시오.

제 코딩 스타일에 변화가 필요함을

느끼기에 이런 어처구니 없는 질문을 올렸습니다.

죄송합니다.

semmal의 이미지

숫자를 그냥 적는 것이 편하다고 생각하시면 그렇게 하시면 되고, 꼭 계산해서 넣어야 할 상황이라면 계산하면 되지 않을까요?
모든 문제를 같은 방법으로 풀려고 하면 안됩니다. 각자 나름대로의 방법이 있는 것이죠.
코딩의 간편함을 따지자면 고정시키는 게 좋고, 메모리를 아껴야 한다면 계산해서 만드는게 좋겠지요.
어떤 식으로 쓰일 지 모른다면 그 프로그램을 짤 당시에 숫자를 그냥 적어서 고정시켜놨다가, 나중에 비효율적이라 생각하면 계산하도록 바꾸면 되겠죠.
소프트웨어는 soft해서 소프트웨어입니다.

덧. 저같으면 무조건 구조가 간편하고 소스코드가 적은 쪽을 선택합니다.
------------------------------
How many legs does a dog have?

------------------------------
How many legs does a dog have?

xog2000의 이미지

답변 감사드립니다 :)
----------------------------------------
// 두뇌설정
memset((void *)&두뇌, 0x00, sizeof(두뇌));

든게 없구나..

----------------------------------------
내가사는세상-Kernelist : http://blog.naver.com/xog2000
"모르는 것은 어리석은 것이 아니다.
어리석은 것은 알려는 의지가 없음을 말한다."

select99의 이미지

궂이 복사할 이유가 있나요?
원본을 보존해야하고 함수1에서 원본을 건드리지 않는이상 그냥 바로씁니다..
포인터의 장점을 이용해야죠.

function1(original);

haze11의 이미지

int function1(char *) / int function2(const char *) 를 구분해서 쓰면 명확하지 않을까요?
함수의 파라미터를 정확히 명시해주는게 함수의 내용을 작성할 때 좋을 듯 하네요.

char *로 넘어오면 마음대로 바꿀 수 있기 때문에 그냥 사용하여 바꾸면 되죠.
const char *로 넘어오면 수정이 불가능 하기 때문에 넘어온 내용을 사용하기 위해
복사하거나 하면 되겠죠? ㅡ.ㅡa

xog2000의 이미지

제가 묻고자 하는 요지가 잘못 전달 된 듯 합니다.

저 부분은 프로그램의 단지 일부분을 축약한 것입니다.

제가 말씀 드리고자 한 것은

대형화된 시스템에서 과연 1024 배열을 다 넘기는 것이

그것을 "HELLO"만을 넘기는 것(더 많은 함수의 호출)보다

더 효율적인지 입니다.

메모리와 퍼포먼스 차이의 문제이겠군요.

제가 이 질문을 하고 나서도

바보 같긴 하군요.

프로그램 구성마나 틀릴 일인데..
----------------------------------------
// 두뇌설정
memset((void *)&두뇌, 0x00, sizeof(두뇌));

든게 없구나..

----------------------------------------
내가사는세상-Kernelist : http://blog.naver.com/xog2000
"모르는 것은 어리석은 것이 아니다.
어리석은 것은 알려는 의지가 없음을 말한다."

익명 사용자의 이미지

배열로 하던 동적할당으로 하던
어차피 함수 내부로 넘어가는 것은 문자열에 대한 포인터 주소값, 즉 단지 4byte밖에 안됩니다.
여기서 함수 호출에 대한 성능 차이를 논한다는 것은 의미가 없습니다.
아무 차이가 없으니까요.
(설마 이걸 모르셔서 이런 글을 올리시지는 않으셨을 듯 하고)

차이점이라면 배열로 하는 것과 동적할당으로 하는 것 중 어느 쪽이 메모리 할당에 대한 오버헤드가 크냐 하는 문제죠.

근데 이걸 논하기 전에 우선 해당 문자열에서 수정이 이루어지냐 아니냐를 따질 필요가 있습니다.
수정이 이루어지지 않는다면 위에 분이 말씀한 대로 그냥 원본 그대로 넘겨받으면 되지 굳이 복사해서 넘길 필요가 없습니다.
하지만 그렇지 않은 걸로 봐서 반드시 문자열을 수정할 필요가 있는 듯 한데...
딱 문자열 길이만큼만 할당받아서 복사하는 걸로 봐서 문자열이 늘어나지는 않는 듯 하군요?

여기서 분기가 하나 생깁니다.
멀티 쓰레드에서 사용되는 함수가 아니라면 고정된 크기의 static char형 배열을 사용하는게 딱 한번의 할당만 이루어지므로 가장 싸게 먹히겠죠.

만약 멀티 쓰레드에서 사용되는 함수라면, 또다시 분기가 생기는데
배열로 하는가 동적할당으로 하는가 입니다.
코드의 의미상으로는 차이가 없지만
많은 컴파일러가 배열은 보통 스택에 그 공간을 잡고 malloc는 힙에 공간을 잡는 경향이 있는데
이건 너무 밑바닥의 얘기라 하드웨어 특성을 알아야만 결정할 수 있을 것 같군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.