문자열에 관련된 궁금증 string과 문자배열

stella770의 이미지

안녕하세요 존경하는 개발자 여러분

코딩하다가 궁금한 점이 있습니다.
이런건 인터넷에 찾아도 잘 나오지 않더군요

문자열 처리할 때 스타일은 다르겠지만 다른사람 코드를 보면

1. char str[256] (memset으로 초기화 후 혹은 str="" 로 초기화)

2. string str; (="" 안해줘도 자동으로 "" 이들어감)

이런 두가지 방식이 있던데 string 클래스는 동적으로 크기를 안할당해줘도 추가될 문자열 만큼 크기를 동적으로 할당해주게되는데

이게 저 char 배열로 만들때보다 메모리를 더 많이 잡아먹거나 연산하는데 많은 시간이 걸리나요?

통상적으로 문자배열을 많이 쓰는 이유는 무엇인가요?

그리고 문자배열 초기화 할때 어떤사람은 memset으로 초기화 하고 어떤사람은 ""로 초기화 하는데
차이점이 무엇인가요?

읽어주셔서 감사합니다.

jick의 이미지

string은 C++이고 char []는 C와 C++ 양쪽에서 모두 쓸 수 있습니다.

C++을 쓰는 중이라면 무조건 string을 강추합니다. 무수한 골치거리를 언어가 알아서 해결해 줍니다.

(뭐, 백만번에 한번 꼴로 문자열을 너무나 미친듯이 처리해야 해서 성능 문제 때문에 C++에서 char 배열을 써야 하는 경우가 있을 수 있는데, 일단 그런 상황 자체가 자주 생기지도 않고, 그런 상황에서 제대로 성능이 나는 코드를 짜려면 언어를 그만큼 잘 이해하고 있어야 합니다. 언어를 이제 막 배우는 사람에게는 해당 사항 없습니다.)

C라면 string은 쓸 수 없으니 char 배열을 쓸 수밖에 없겠지요. 그러니까 라이브러리가 C와 C++ 양쪽에서 모두 쓰이는 경우라면 호환성을 위해 char 배열을 쓸 수 있습니다. (그게 아니고 C++ 전용인데 char 배열을 쓰는 경우라면 개발자가 변태 취향일 가능성이... -.-)

stella770의 이미지

답변감사드립니다.
현재 신입 들어온지 8개월 차인데요 c# ui 관련만 하다가 갑자기 c++ 부서로 옮겨지게 되었는데
코드를 받아서 하던도중 궁금해서 질문드린거였습니다 ㅠ.ㅠ.
아마 리눅스에서도 호환되는 qt로 베이스로 작성된 거였는데 리눅스용 윈도우용 따로 빌드가 되있는데 아마 그것때문이지 않을까 싶기도 하고 혹시 처리하는데 배열로 처리하는게 2배 빠르다거나 이게 궁금했습니다 ㅠ.ㅠ.

jick의 이미지

한 10년쯤(?) 전에는 C++ standard library의 성능이 그저그렇던 시절이 있어서 성능 문제 때문에 C++에서 제공하는 string을 안 쓰고 수동으로 char 배열을 쓰던 경우도 있었다고 합니다.

그리고 (일단 이런 게 습관이 되면 잘 안 바뀌기 때문에) "string은 느리다더라 그러니까 그냥 char 배열 써라" 같은 분위기가 특별한 검증 과정 없이 지속되어 왔을 수도 있습니다.

하여튼 2017년 기준으로 성능 문제 때문에 string을 안 쓴다는 건, 실제로 profiler 돌려서 문자열 처리에 들어가는 시간이 CPU의 몇 %인지 보여주지 않는 한 삽질이라고 개인적으로 생각합니다.

* 뭐 말은 그렇고, 기존의 라이브러리가 수십만 줄인데 char 배열을 쓰고 있으면 뭐 어쩌겠습니까 기존의 코딩 스탠다드를 따라야지요. -_-

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.