c++의 메모리 할당방식이 궁금합니다.

호기심천국의 이미지

안녕하세요 기초가 많이 약한 c++ 초보입니다.

(편의상)char*의 realloc이나 vector의 resize를 통해 메모리를 재할당할때 궁금한점이 있어서 질문드립니다.

제 생각에는 realloc이나 resize로 char* 이나 vector의 사이즈를 확장할때 기존에 다른 변수가 사용된 메모리를 침범할 수 있을것 같은데, 이런경우는 발생하지 않나요?

예를들어 메모리주소 1이라는곳에 char* arr가 생성되어있고, 메모리주소 10이라는곳에 int x라는 것이 할당되어있을때, realloc(arr, 20)을 하면 x의 값에 영향을 미치게 될 것 같아보여서요.

그렇다고 realloc이 x가 할당된 주소 10을 피해서 1~9, 11~21을 할당하는것 처럼 보이지는 않구요. (연속성때문에..)

그러고보니 근본적으로 애초에 변수를 선언할때 어떤식으로 메모리 주소를 할당해주는지도 궁금하네요... 랜덤하게 주는건 아닐것같은데 ㅠ

궁금한게 많습니다. 고수님들 알려주세요~~!

raymundo의 이미지

그 경우 realloc 은 20바이트를 연속으로 확보할 수 있는 다른 곳에다 공간을 확보하고, 기존에 할당되었던 공간(arr이 가리키던)에 있던 내용을 그쪽으로 복사한 후, 새 공간의 시작 주소를 반환합니다. 즉 realloc(arr, 20)의 반환값은 arr의 기존값일 수도 있고, 아닐 수도 있습니다.

그 다음 질문, "근본적으로...."는 컴파일러와 런타임 라이브러리의 영역인데, 기본적으로 지역 변수라면 컴파일 과정에서 코드에 선언된 순서대로 "이놈은 int 니까 스택포인터-4 부터 스택포인터-1까지 총 4바이트에 저장하도록 하자" "그 다음 놈은 double 인데, 좀 전에 스택포인터 - 4 까지는 썼으니 이번 건 스택포인터-12 부터 스택포인터-5까지 8바이트에 저장하도록 하자"는 식으로 기계어를 만들어나가겠죠.

malloc 같은 경우는 실행 시간에 런타임 라이브러리가 처리할 텐데, 미리 운영체제에 좀 큼지막하게 메모리를 받아둔 다음에, 그걸 쪼개어 내어주고 빈 공간을 관리하는 식으로 돌고 있을 거고요.

여기까지는 아주 개론적인 얘기고 실제로 들어가는 건 시스템 프로그래밍 많이 하시는 분들이 답변해주실 거라 믿습니다;;;; 예를 들면 이런 글이 있군요.
http://egloos.zum.com/minjang/v/1232908

좋은 하루 되세요!

댓글 달기

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