왠지 조금 불안해서 여쭤봅니다..

Seven..의 이미지

둘다 맞는거 같기는 한데;;그래도
확인해보고 싶어서 이렇게 여쭤봅니다..

int* pINT[100];

이런 정의가 있을때 모두 0 으로 만들기 위해서

옛날에는 for를 이용했는데..

memset(&(pINT[0]), 0, sizeof(int*) * 100);

혹은

memset(pINT, 0, sizeof(int*) * 100);

둘 모두 안전한 코드인지 알고 싶어서 이렇게 여쭤봅니다.

pynoos의 이미지

void * 로 받고 모두 암묵적인 캐스팅이 일어납니다.
게다가 배열의 첫번째 원소의 주소가 배열이름만으로도 접근가능하다는
규칙(?)이 있기 때문에 모두 안전합니다.

memset(pINT, 0, sizeof pINT);

저는 이것을 더 선호합니다.

doldori의 이미지

이와 비슷한 논의가 있었는데 특히 전웅 님의 포스팅을 눈여겨 보시기 바랍니다.

http://bbs.kldp.org/viewtopic.php?t=22802&highlight=%C0%FC%BF%F5

결론은 '이식성을 고려한다면 별로 안전하지 않다'입니다.
배열 원소를 널 포인터로 초기화할 목적이라면 훨씬 이해하기 쉬운 방법이 있습니다.

int* pINT[100] = { NULL };

Seven..의 이미지

클래스의 멤버 변수인 경우에는

int *pInt[100] = {null};

이런 방법을 사용할 수 없어서요;;
감사합니다 많은 도움이 됐습니다.

하나 더 덧질문 드리면

class CXXX
{
        많은 변수들...
public:
        CXXX() { memset(this, 0, sizeof(CXXX)); }
}

이것은 어떤가요?

부모 클래스로서도 안전하게 되는지..요?

VENI VIDI VICI

doldori의 이미지

클래스 개체를 초기화할 목적이라면 더욱 위험하죠. 각 멤버의 생성자에게 초기화를 맡기거나,
내장형이라면 멤버의 형에 맞는 값으로 명시적인 초기화를 하는 것이 좋습니다.
위의 링크에서도 나왔듯이 memset은 초기화에는 거의 무용지물입니다.
(이식성을 고려한다면 그렇다는 얘깁니다.) '해봤더니 되더라'는 반론은 사절합니다.

pynoos의 이미지

Seven.. 님께서 안전, 불안전하다는 논의가 처음 글에서 유추해보건데 첫번째 인자라면, 둘 다 안전한 것입니다.

이미 둘째 인자에 대한 것은 0으로 놓으셨으니, NULL 이 0인 환경에서라고 가정한 것입니다.

어디에서든 NULL 을 0으로 가정하고 진행하는 것은 안전하지 않을 수 있지만, 요즘은 거의 그런 장비는 만나지 못할 것입니다.

추가로 질문하신 내용에서 class의 this 를 가지고 모두 0으로 뭉개버리는(?)일은 참으로 위험합니다.

습관상으로도 좋지 않으며, 심지어 가상 함수 테이블등이 있다면 잘못된 결과를 일으킬 수 도 있습니다.

vacancy의 이미지

멤버 변수 하나하나 초기화해주세요.

Seven..의 이미지

넵.. 하나하나 해야겠군요

처음 질문에 대한 방법은.. 안전함으로 사료되고..

null 을 0 으로 초기화해도 큰 무리는 없을 것이다..

아마 앞으로 나오는 머신들에 대해서도...

라고 답변을 정리하고..

클래스에 대한 memset은 매우 위험하니 하지 말아야겠군요;;

VENI VIDI VICI

cbycby의 이미지

물론, class 초기화 내에서 memset 하는것은 중대한 문제를 일으킬 수 있음을 잘 알고 있습니다.
하지만 저의 경우 이 문제가 goto 문과 같지 않는 문제가 아닐까라는 생각을 해봅니다.
goto가 분명 존재하는 문법인데, goto문이 가져오는 코드의 난잡함때문에
goto 문이면 한방에 끝날 2중 이상 loop을 graceful하게 code를 구성한다고
flag변수를 두는 행위를 말입니다.
물론 이역시 논란의 대상이 될 수 있겠지만...
저의 경우는 자신이 그것이 무엇을 의도하는지에 대한 정확한 인지가 가능하다면 써도 무방하다는 것입니다. (팀관련 프로젝트 일때에는 약간 상황이 달라질 수 있지만. 이역시도 잘된 문서화등을 통하면 그리 문제될것 같지는 않다라고 생각합니다.)

그럼 memset으로 돌아가면, 가령, configuration을 관리하는 class가 있다라고 하면

class Configuration
{
private:
       int aaa[100];
       int bbb[1000];
       char cccc[111];
       ...
       char zzz[222];

public:
       Configuration() { memset(this, 0, sizoef(*this); }

       bool Load();
       bool Save();
};

위의 코드는 아주 편한 코드가 되는거 아닌가요?
물론, Configuration 코드 상단에 이런 주석을 달아야겠죠...
절대 virtual 금지!!! class내에서 기본 데이타 타입을 가지지 않는 class
정의 금지!!! 이런조항을요..

위 작성된 코드는 분명 목적을 가지고 정확한 인지를 하고 사용했기때문에
큰 문제가 없을거란 판단을 합니다.

http://www.korone.net QT 커뮤니티 사이트

vacancy의 이미지

편리한 코드라는게 무슨 의미인지 잘 모르겠네요.
다중 루프에서의 goto문 같은 경우는 아주 특별한 상황입니다.
Java같은 명령은 다중 루프를 빠져나갈수 있는 break/continue를 만들고
goto 명령을 아예 없애버렸죠.
어쨌든 그런 goto의 경우엔 그래도 portable하고
어떤 상황에서든 안정적으로 동작할 거라는 예상은 할수 있죠. ;;
( 다중루프 빠져나가는 경우가 아닌, 막쓰는 goto는 곤란하겠죠. -_- 좀 )

그런데 이번 경우에는 코딩라인수가 줄어들었다는 점은 편할지 몰라도,
유지보수라는 입장에서는 편할지 안편할지 모르죠.
이식성에 있어서도 어떤지 모르고요.

이런 코드는 정말 웬만하면 작성하지 않는 것이 좋지 않을까요.
정말 손톱만치의 퍼포먼스 향상마저 중요한, 심각한 상황이라면 모를까요.

cbycby의 이미지

vacancy wrote:
편리한 코드라는게 무슨 의미인지 잘 모르겠네요.
다중 루프에서의 goto문 같은 경우는 아주 특별한 상황입니다.
Java같은 명령은 다중 루프를 빠져나갈수 있는 break/continue를 만들고
goto 명령을 아예 없애버렸죠.
어쨌든 그런 goto의 경우엔 그래도 portable하고
어떤 상황에서든 안정적으로 동작할 거라는 예상은 할수 있죠. ;;
( 다중루프 빠져나가는 경우가 아닌, 막쓰는 goto는 곤란하겠죠. -_- 좀 )

그런데 이번 경우에는 코딩라인수가 줄어들었다는 점은 편할지 몰라도,
유지보수라는 입장에서는 편할지 안편할지 모르죠.
이식성에 있어서도 어떤지 모르고요.

이런 코드는 정말 웬만하면 작성하지 않는 것이 좋지 않을까요.
정말 손톱만치의 퍼포먼스 향상마저 중요한, 심각한 상황이라면 모를까요.

음... 원칙적으로 님의 말씀이 맞고 저도 이해하지만 노동성(?) 코드를 하기 싫어서 꽤 부리고 싶은건 어떻게 해야할런지...
이세계를 떠나야 하나 ^^

http://www.korone.net QT 커뮤니티 사이트

댓글 달기

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