스택 메모리와 스택 구조에 대해

hmd7932의 이미지

자료구조를 공부하고 있던 중 궁금한 점이 있어 올립니다.

스택이라는 후입선출 구조에 대해 공부하고 있는데 한 가지 의문점이 생겨서 질문드립니다.

Push, Pop, Peek가 대표적인 스택의 동작이라는 것을 공부하였는데

"스택메모리같이 지역 변수 등을 차곡차곡 쌓아두는 이런 메카니즘을 스택으로 구현하다면 편리하다라는 말이 좀 걸리는데요?"

물론 할당과 해제 면에서 편리하다는 의미를 알겠는데, 실제 코드를 작성하다보면 변수에 랜덤으로 액세스하게 되잖아요?

예를 들면 bottom에서 top으로 a=1,b=33,c=5,d=7라는 데이터가 쌓여있을 때, 코드에서 b라는 데이터에 접근했다가 c라는 데이터에 접근했다라는 것과 같이...

즉 스택 메모리에서 스택이라는 자료구조가 편하다는 측면은 자료의 할당과 해제 측면에서 편리하다는 말인지 이것을 알고싶습니다.

익명 사용자의 이미지

namespace를 stack으로 관리합니다.

f()
{
  int a;
  {
    int a;
    {
      int a;
    }
  }
}
statement를 들어왔다가 나갈 때는 이전 상태로 복귀해야하니까요.
ifree의 이미지

스택이라는 자료구조가 편하다는 측면은 자료의 할당과 해제 측면에서 편리하다. - OK
일단 스택에 올라간 데이터는 스택 포인터 (ESP)로 랜덤하게 접근할 수 있습니다.

hmd7932의 이미지

스택포인터라는게 최상위 데이터만 가르키는게 아니었군요 ^^; 열심히 공부해야겠네요ㅜㅜ

dltkddyd의 이미지

int ar[10];
int* dar=new int[10];

위에서 첫 번째와 달리 두 번째는 동적으로 할당되는 배열이라는 점을 제외하면 ar과 다를 것이 없습니다. 이런 배열구조에서는 후입선출법으로 메모리를 관리하는 것이 큰 장점이 됩니다. 그렇지 않은 경우에는 속도면에서 엄청난 낭비가 초래됩니다. 직접 vector와 같은 동적배열을 구현해보신다면 왜 스택이라는 자료구조가 필요한지 자연스럽게 알게됩니다. 스택이 왜 필요한지 궁금하시다면 vector를 공부해보세요. 메모리가 어떻게 생성되고 해제되는지를 생각해보면서요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

hmd7932의 이미지

스택이라는 자료구조가 어떤 데이터 입출력의 모델링에 있어 유용한건 알겠는데 아직 Vector라는 동적 배열에 대해서의 유용성에서는 몰랐네요. 열심히 공부해야겠습니다 ㅜㅜ

shxodlf3의 이미지

질문 내용중

"실제 코드를 작성하다보면 변수에 랜덤으로 액세스하게 되잖아요?"

라는 부분이 있어서 말씀드릴께요

프로그램에 있어서 절대적인 랜덤은 없어요

어디까지나 다 일정한 규칙으로 사용자가 요구하는 사항에 근접 또는 정확하게 맞추어 줄 뿐입니다

질문자분이 인식하시는 랜덤도 실제 랜덤을 구현하는 방식이 존재합니다 (메르센 트위스터, WELL ..)

이제 1년밖에 안되었지만 제가 겪은 바로는

어디까지나 프로그램은 정확하게 인풋에 대한 아웃풋

거짓말을 하지는 않더라구요

"스택메모리같이 지역 변수 등을 차곡차곡 쌓아두는 이런 메카니즘을 스택으로 구현하다면 편리하다라는 말" 은

위의 예를 생각해 본다면

사용자 입장에서는 랜덤으로 느껴지게 되지만

스택메모리에 변수를 할당이나 해제, 연산 하는 무엇인가 매커니즘이 있을겁니다

그리고 그 매커니즘에 가장 효율적인게 스택이라는 후입선출 방식이라고 생각하시는게 맞는거 같습니다

1년차 임베디드 소프트쟁이 입니다

시스템에 관심이 많습니다

DarkSide의 이미지

질문자의 질문 문맥이랑은 다른 듯.
질문자는 랜덤 함수를 의미한 게 아니라,
프로그래머가 임의로 스택 변수에 접근하는 경우를 말하는 것입니다.

hmd7932의 이미지

대신 말씀해주셨네요 ^^

shxodlf3의 이미지

엉뚱한 댓글 죄송합니다

1년차 임베디드 소프트쟁이 입니다

시스템에 관심이 많습니다

댓글 달기

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