지역 변수 선언 위치에 대한 궁금증.

yann8166의 이미지

cppcheck 검사 결과 variableScope 관련 워닝을 발견 하였습니다.

아래는 예시입니다.

int function()
{
    int a = 0;
    for ( int i = 0; i < NUM; ++i )
     {
           array[a] = num;
           a++;
      }
}

이와 같은 상황에서 변수 a를 for문 속에서 선언하라고 결과가 나왔는데

매번 a의 메모리를 반복해서 할당 하는 연산이 int형 변수 하나를 함수가 죽기 전까지 잡아 두는 것보다 나은 방법인가요?

coolseed의 이미지

효율성의 문제가 아니라 말 그대로 scope의 문제입니다.
a가 for문 외부에서 사용할 일이 없으면 외부에서 선언할 필요가 없다는것이지요..

말씀하신 효율성 면으로 봤을때는 다른 문제가 됩니다.

{} 블럭내에서만 사용하는 변수라면 당연히 블럭내에서 선언해야하는것이고
블럭 내 작업 이후에도 해당 변수를 사용할일이 있다면 블럭 외부에서 선언하는게 당연한거 아니겠습니까?

coolseed의 이미지

간단하게 위 코드에서 for 블럭 이후에 단순히 a를 출력하는 printf만 하나 더 있어도 해당 scopewarning은 나질 않을겁니다.

jick의 이미지

1. 일단 스택에 잡히는 로컬 변수니 heap에 메모리를 할당하는 일은 없습니다.

2. 요즘 컴파일러는 최적화를 잘 하기 때문에 "int a"가 for loop 안에 있든 밖에 있든, 그것 가지고 스택포인터를 계속 건드리지는 않습니다. 예시된 코드대로라면 십중팔구 아예 스택도 안 쓰고 레지스터를 사용할 가능성이 높습니다.

3. 그건 그렇다 치고, 저 코드에서 int i = 0을 for loop 안으로 집어넣어 버리면 동작이 달라질 텐데요? -_-

kukyakya의 이미지

3.에 i가 아니라 a를 의미하신 듯 한데, 다음과 같이 사용하면 동작도 달라지지 않고 워닝이 뜨지 않을 것 같습니다.

for (int a = 0, i = 0; i < NUM; ++i )
{
...
}

댓글 달기

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