클래스 개체를 초기화할 목적이라면 더욱 위험하죠. 각 멤버의 생성자에게 초기화를 맡기거나,
내장형이라면 멤버의 형에 맞는 값으로 명시적인 초기화를 하는 것이 좋습니다.
위의 링크에서도 나왔듯이 memset은 초기화에는 거의 무용지물입니다.
(이식성을 고려한다면 그렇다는 얘깁니다.) '해봤더니 되더라'는 반론은 사절합니다.
물론, 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
정의 금지!!! 이런조항을요..
위 작성된 코드는 분명 목적을 가지고 정확한 인지를 하고 사용했기때문에
큰 문제가 없을거란 판단을 합니다.
편리한 코드라는게 무슨 의미인지 잘 모르겠네요.
다중 루프에서의 goto문 같은 경우는 아주 특별한 상황입니다.
Java같은 명령은 다중 루프를 빠져나갈수 있는 break/continue를 만들고
goto 명령을 아예 없애버렸죠.
어쨌든 그런 goto의 경우엔 그래도 portable하고
어떤 상황에서든 안정적으로 동작할 거라는 예상은 할수 있죠. ;;
( 다중루프 빠져나가는 경우가 아닌, 막쓰는 goto는 곤란하겠죠. -_- 좀 )
그런데 이번 경우에는 코딩라인수가 줄어들었다는 점은 편할지 몰라도,
유지보수라는 입장에서는 편할지 안편할지 모르죠.
이식성에 있어서도 어떤지 모르고요.
이런 코드는 정말 웬만하면 작성하지 않는 것이 좋지 않을까요.
정말 손톱만치의 퍼포먼스 향상마저 중요한, 심각한 상황이라면 모를까요.
편리한 코드라는게 무슨 의미인지 잘 모르겠네요.
다중 루프에서의 goto문 같은 경우는 아주 특별한 상황입니다.
Java같은 명령은 다중 루프를 빠져나갈수 있는 break/continue를 만들고
goto 명령을 아예 없애버렸죠.
어쨌든 그런 goto의 경우엔 그래도 portable하고
어떤 상황에서든 안정적으로 동작할 거라는 예상은 할수 있죠. ;;
( 다중루프 빠져나가는 경우가 아닌, 막쓰는 goto는 곤란하겠죠. -_- 좀 )
그런데 이번 경우에는 코딩라인수가 줄어들었다는 점은 편할지 몰라도,
유지보수라는 입장에서는 편할지 안편할지 모르죠.
이식성에 있어서도 어떤지 모르고요.
이런 코드는 정말 웬만하면 작성하지 않는 것이 좋지 않을까요.
정말 손톱만치의 퍼포먼스 향상마저 중요한, 심각한 상황이라면 모를까요.
음... 원칙적으로 님의 말씀이 맞고 저도 이해하지만 노동성(?) 코드를 하기 싫어서 꽤 부리고 싶은건 어떻게 해야할런지...
이세계를 떠나야 하나 ^^
void * 로 받고 모두 암묵적인 캐스팅이 일어납니다.게다가 배열의
void * 로 받고 모두 암묵적인 캐스팅이 일어납니다.
게다가 배열의 첫번째 원소의 주소가 배열이름만으로도 접근가능하다는
규칙(?)이 있기 때문에 모두 안전합니다.
저는 이것을 더 선호합니다.
---
http://coolengineer.com
이와 비슷한 논의가 있었는데 특히 전웅 님의 포스팅을 눈여겨 보시기 바랍
이와 비슷한 논의가 있었는데 특히 전웅 님의 포스팅을 눈여겨 보시기 바랍니다.
http://bbs.kldp.org/viewtopic.php?t=22802&highlight=%C0%FC%BF%F5
결론은 '이식성을 고려한다면 별로 안전하지 않다'입니다.
배열 원소를 널 포인터로 초기화할 목적이라면 훨씬 이해하기 쉬운 방법이 있습니다.
int* pINT[100] = { NULL };
..
클래스의 멤버 변수인 경우에는
int *pInt[100] = {null};
이런 방법을 사용할 수 없어서요;;
감사합니다 많은 도움이 됐습니다.
하나 더 덧질문 드리면
이것은 어떤가요?
부모 클래스로서도 안전하게 되는지..요?
VENI VIDI VICI
클래스 개체를 초기화할 목적이라면 더욱 위험하죠. 각 멤버의 생성자에게
클래스 개체를 초기화할 목적이라면 더욱 위험하죠. 각 멤버의 생성자에게 초기화를 맡기거나,
내장형이라면 멤버의 형에 맞는 값으로 명시적인 초기화를 하는 것이 좋습니다.
위의 링크에서도 나왔듯이 memset은 초기화에는 거의 무용지물입니다.
(이식성을 고려한다면 그렇다는 얘깁니다.) '해봤더니 되더라'는 반론은 사절합니다.
Seven.. 님께서 안전, 불안전하다는 논의가 처음 글에서 유추해보건데
Seven.. 님께서 안전, 불안전하다는 논의가 처음 글에서 유추해보건데 첫번째 인자라면, 둘 다 안전한 것입니다.
이미 둘째 인자에 대한 것은 0으로 놓으셨으니, NULL 이 0인 환경에서라고 가정한 것입니다.
어디에서든 NULL 을 0으로 가정하고 진행하는 것은 안전하지 않을 수 있지만, 요즘은 거의 그런 장비는 만나지 못할 것입니다.
추가로 질문하신 내용에서 class의 this 를 가지고 모두 0으로 뭉개버리는(?)일은 참으로 위험합니다.
습관상으로도 좋지 않으며, 심지어 가상 함수 테이블등이 있다면 잘못된 결과를 일으킬 수 도 있습니다.
---
http://coolengineer.com
멤버 변수 하나하나 초기화해주세요.
멤버 변수 하나하나 초기화해주세요.
^^
넵.. 하나하나 해야겠군요
처음 질문에 대한 방법은.. 안전함으로 사료되고..
null 을 0 으로 초기화해도 큰 무리는 없을 것이다..
아마 앞으로 나오는 머신들에 대해서도...
라고 답변을 정리하고..
클래스에 대한 memset은 매우 위험하니 하지 말아야겠군요;;
VENI VIDI VICI
저는 가끔 class 초기화 내에서 memset 사용합니다.
물론, class 초기화 내에서 memset 하는것은 중대한 문제를 일으킬 수 있음을 잘 알고 있습니다.
하지만 저의 경우 이 문제가 goto 문과 같지 않는 문제가 아닐까라는 생각을 해봅니다.
goto가 분명 존재하는 문법인데, goto문이 가져오는 코드의 난잡함때문에
goto 문이면 한방에 끝날 2중 이상 loop을 graceful하게 code를 구성한다고
flag변수를 두는 행위를 말입니다.
물론 이역시 논란의 대상이 될 수 있겠지만...
저의 경우는 자신이 그것이 무엇을 의도하는지에 대한 정확한 인지가 가능하다면 써도 무방하다는 것입니다. (팀관련 프로젝트 일때에는 약간 상황이 달라질 수 있지만. 이역시도 잘된 문서화등을 통하면 그리 문제될것 같지는 않다라고 생각합니다.)
그럼 memset으로 돌아가면, 가령, configuration을 관리하는 class가 있다라고 하면
위의 코드는 아주 편한 코드가 되는거 아닌가요?
물론, Configuration 코드 상단에 이런 주석을 달아야겠죠...
절대 virtual 금지!!! class내에서 기본 데이타 타입을 가지지 않는 class
정의 금지!!! 이런조항을요..
위 작성된 코드는 분명 목적을 가지고 정확한 인지를 하고 사용했기때문에
큰 문제가 없을거란 판단을 합니다.
http://www.korone.net QT 커뮤니티 사이트
편리한 코드라는게 무슨 의미인지 잘 모르겠네요.다중 루프에서의 got
편리한 코드라는게 무슨 의미인지 잘 모르겠네요.
다중 루프에서의 goto문 같은 경우는 아주 특별한 상황입니다.
Java같은 명령은 다중 루프를 빠져나갈수 있는 break/continue를 만들고
goto 명령을 아예 없애버렸죠.
어쨌든 그런 goto의 경우엔 그래도 portable하고
어떤 상황에서든 안정적으로 동작할 거라는 예상은 할수 있죠. ;;
( 다중루프 빠져나가는 경우가 아닌, 막쓰는 goto는 곤란하겠죠. -_- 좀 )
그런데 이번 경우에는 코딩라인수가 줄어들었다는 점은 편할지 몰라도,
유지보수라는 입장에서는 편할지 안편할지 모르죠.
이식성에 있어서도 어떤지 모르고요.
이런 코드는 정말 웬만하면 작성하지 않는 것이 좋지 않을까요.
정말 손톱만치의 퍼포먼스 향상마저 중요한, 심각한 상황이라면 모를까요.
편리한 코드라는것은
음... 원칙적으로 님의 말씀이 맞고 저도 이해하지만 노동성(?) 코드를 하기 싫어서 꽤 부리고 싶은건 어떻게 해야할런지...
이세계를 떠나야 하나 ^^
http://www.korone.net QT 커뮤니티 사이트
댓글 달기