프로그래밍 관련/프로그래밍 관련팁

struct 초기화 구성~ struct 최적화 팁 관련

AlrepondTech 2020. 9. 15. 12:03
반응형

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

 

제가 예전에 카페에 썼던 내용을 발췌했습니다 ㅎㅎ ~

출처: http://cafe.naver.com/jzsdn/15153

간단하지만 요즘에서야 느끼는 것~(init만 추가 했을 뿐 인데;)

(구성에 따라 다르지만 이런거에 감명받는 <- 뵨태 ㅠㅠ)

typedef struct _TUserInfo {
    int nNum;
    int nCode void init() {
        nNum = 0;
        nCode = 0;
    }
    _TUserInfo() {
        init();
    }
}
TUserInfo;
typedef struct _TUserInfo {
    int nNum;
    int nCode void init(int _val=0, int _val2=0) {
        nNum = _val;
        nCode = _val2;
    }
    _TUserInfo(int _val=0, int _val2=0) {
        init(_val, _val2);
    }; // int _val, int _val2 안 넣어두 그냥써두 각각~
}
TUserInfo;

 

다른 초기화 구성두 리플을 달아 보아요~ ^^

각자 자기만의 초기화 구성~

----------------------------------------------------------------------------------------------------------------------------------------------

typedef을 하는 이유가 있나요??

그냥 struct 써서 코드 보여주어두 되는데;; 버릇으로 붙이게 되네요 ㅎㅎ;;

^^

음 그리고 _T**** -> T**** 로 바꾸어야 겠다는 이상한 사명감 비슷한 버릇이 있어서;; 
사람들 마다 코드특징도 참 재미있는 것 같아요 ㅋㅋ

그냥 생성자 쓰는 것 하고는 다른가요?

그냥 생성자에서 초기화 불러다 쓰는것이고 생성자에서 모두 초기화 해주어두 되지만 하는 이유는~
,여러번 초기화 해주는 경우.. init()를 불러다 써준다는 개념으로 넣었습니다~ ,
스타일에 따라 생성자에 초기화 해주고~ 넣어주셔도 무방합니다 ~ ㅎ

버즈 // 처음부터 T***로 해도 되지않나요??

저는 _T**** 하면서 나중에 포인터나 벡터 이터레이터로 함유시킬려 할때 '_'를 때면서 
이름을 바꾸는게 버릇이 되어성~ 그냥 쓰셔두 됩니다~ _T는 base 버전이름이고 나중에
이름을 지은 것은 "변형하거나, 더한 것이다" 그런 식으로 명칭을 정하며 쓰고 있습니다 ^^
날자고도님의 struct 구성 스타일도 궁금해지네요 ㅎㅎ~

예전에 typedef를 struct에 왜 붙일까 고민한적이 있습니다.
그런데, c로 프로그램짜보니 바로 이해가 되더군요. ^^

c에서는 인스턴스를 생성할때, 

"struct 구조체명 인스턴스명"
을 해야하더군요.

"구조체명 인스턴스명"
으로 줄여서 사용하려면 typedef를 사용해야하고요.

지금 stl에서 콘테이너 생성시 짧게 적을려고 typedef를 사용하듯이요.

그런데, 이경우 이름을 같게 할수가 없으니깐, 언더바_ 를 붙이더군요.
이건 순전히 제생각이고, 맞는지는 모르겠습니다 ^^;

그냥 c프로그램을 짜보니, 그럴거 같다 짐직하는거지요..

결론은,..
저는 struct에서 굳이 typedef를 사용하지 않습니다. ^^;;

날자고도님 말이 맞을 것 같습니다 , 흠.. 그러고 보니 예전에 typedef struct{..} T***; 이런 방식
으로도 썼었는데 C강의에서 그런식은 쓰지말고 struct 따로 빼서 쓰라고 훈방해 주셨는데. C강의에서
정석으로 가르쳐 주려고 했던 것 같습니다..음.. VS에서 struct를 그냥 쓰고 있지만 이걸보고 다시
생각하게 되네요~ 날자고도님 ㄳㄳ ㅋㅋ~

 

버즈// 기능에 별 차이가 없다면, 생성자의 경우가 호출비용이 적게 들지 않나요?

 

ㄴ 저의 경우를 얘기하자면, 변수를 초기화해야할경우가 생성후에도 생기더군요. ^^
그럴게 된다면, 코드가 중복되니, 함수를 만들어야 했고요.

 

아마도~ 호출을 안하고 직접하는게 빠르기를 따진다면 제일 빠를 거에요~, 간단하게 
변수하나로 초기화하고 싶은데 struct에 애교로 init를 넣어준 것이라 생각하시면되요.~
init만드니 생성자에 차라리 init를 넣어두고 init를 초기화 목적으로 썼습니다~.
struct를 작성하다 무심코 이상하게 구성에 대하여 생각하여 쓰게 되었습니다..
아.. 효율성 때문에 배수인가 짝수로 데이터 크기를 맞추는 분도 있던데 왜 그렇게
해야하는지 아시는분? 답변~! 부탁드립니다 (어렴풋이만 알고 있어서요;;)

 

날자고도// 오호~ 그렇군요. 그냥 손으로 입력했었는데 ㅎㅎ. 나중에 읽을 때를 생각하면 init를 만드는게 좋겠네요.

 

버즈 // 32비트PC에서 4바이트 단위로 데이터크기를 맞추는게 성능이 좋다더군요.
하지만, 64비트에서는 포인터만 8바이트 데이터는 4바이트.. ^^

예를 들어 bool형 보다는 BOOL형이 성능이좋다고 하더군요

 

날자고도님 감사합니다~ ㅎㅎ

stUser() : a(0), b(0) {}
stUser(int _a, int _b) : a(_a), b(_b) {}
stUser stTemp = {0}; -> 이건 생성자가 있을 경우 안됩니다.

데이터 배수를 해당 cpu에 맞게 바꾸는 것은 이유가 참 많지만 그 중 하나를 들어보면 
레지스터로 한번에 읽을 수 있기 때문입니다.
날자고도님이 설명하신 bool과 BOOL의 비교연산을 보면, (디스어셈으로..)
BOOL형일 경우에는 일반적인 비교연산인 cmp한번으로 끝나지만 
bool형은 movzx로 레지스터에 강제로 3바이트를 0으로 할당하며 채우고 나서 test라는 명령으로 
비교값을 얻게 됩니다. 현재 cpu에서 명령어 하나 늘어나는 것쯤 별거 아니지만 
데이터의 읽기, 쓰기로 가면 안그래도 느린 io속도가 더 느려지게 되죠.. 
그래서 가장 기본적으로 4바이트씩 맞춰서 사용합니다.

아 그래서 BOOL 성능이 좋은 거구나 바이트 차이가 번거롭게 하네요~
(컼;; 저는 bool 만 써왔는데, 습관 고쳐야 할듯..작은 차이라두 커지니;; 모리님 감사합니다~ ㅎ)

 

release모드로 해서 디어셈으로 코드를 봣는데, 컴파일러 최적화를 해주던데요. bool이나 BOOL이나 동일한 결과가... 디버그 모드에서는 위에 말씀 하신것처럼 나오구요...

 

음.. 최적화로 변경 시켜주는 것 인가?.. (최적화의 배려;;)

 

volatile를 앞에 써주시면 해당 변수가 최적화되지 않고 제대로 나오게 돼죠..

 

primitive type 의 경우 structureTypeName() 이면 0 으로 초기화를 해준다더군요.
블로그에서 봤는데, ^^ 확인해보시길.

 

 

=================================

=================================

=================================

 

 

 

반응형