[완료] sizeof의 속도(?)
글쓴이: mauri / 작성시간: 목, 2009/06/18 - 2:05오후
안녕하세요.
개발중에 sizeof라는 것이 의문이 들어서 질문 드립니다.
요점부터 간단하게 말씀 드리자면 빈번하게 호출되는 함수에서 구조체가 사용되는데..
(1)매번 sizeof를 하는게 빠를까요?
(2)구조체 크기 변수를 하나 두고, 프로그램 시작시 초기화 한후 이 변수를 사용하는게 빠를까요?
(3)신경쓸시간에 코드 한자 더 짜는게 빠를까요?
STRUCT st; while(1) { recv(sock, (char*)&st, sizeof(st), 0); }
int size; // 전역 size = sizeof(st); // 초기화 -------------------------------------------- while(1) { recv(sock, (char*)&st, size, 0); }
sizeof라는 것은 키워드이므로 컴파일 시점에 크기가 미리 정해진다고 생각은 듭니다만..
예상일 뿐인지라 궁금해서 질문 드립니다.
그럼.. 매일매일 즐거운 개발 되십시요.. ^^
/////////////////////////////////////////////////////////////////////////////////
답변주신 모든 분들께 감사드립니다.. ^^
Forums:
저도 이게
저도 이게 궁금하구요.
_countof 이런것두 있던데.. 이건 표준인가요?
-----------------------
과거를 알고 싶거든 오늘의 네 모습을 보아라. 그것이 과거의 너니라.
그리고 내일을 알고 싶으냐? 그러면 오늘의 너를 보아라. 그것이 바로 미래의 너니라.
-----------------------
내가 쓰는 글은 틀릴 수 있습니다.
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
저도 sizeof 는
저도 sizeof 는 compile-time 에 치환되는 게 맞는 걸로 알고 있는데요.
sizeof(st) 는 런타임 중에 변할 수 없는 상수 값인것 같은데.. 변수 값으로 사용한다는 게 좀 이상한 것 같네요.
---
Emerging the World!
Emerging the World!
십중팔구
sizeof는 컴파일 타임에 계산되므로 sizeof를 쓰는 게 빠릅니다.
사실 속도가 문제가 아니라, sizeof로 상수값이 나오는 걸 굳이 별도의 변수를 만들어서 저장해 두는 건 한줄로 될 코드를 두 줄로 만드는 거라서 가독성에 별로 좋지 않습니다. (뭐, sizeof 뒤의 type name이 딥따 길고 여러 군데에서 사용해서, 한번 변수 만들고 여러번 쓰겠다는 경우면 또 다르겠습니다만.)
(뭐 C99 같은 데서는 variable length array를 선언한 다음에 sizeof를 부르는 변태적인 짓도 가능하다고 하는데 그런 식으로 써본 적이 없어서 잘 모르겠습니다.)
sizeof는 프리컴파일
sizeof는 프리컴파일 할 때 바뀌지 않나요?
만약 그렇다면 상수와 같이 취급되어서 속도에 영향이 없을 것 같습니다.
테스트 하는 방법은 sizeof를 100만번 정도 호출한거랑 상수 100만번 사용한 거랑 비교하면 될텐데요.
소스 짜는 중...
size를 변수에 대입하게 만들었는데..
100만번으로 안되는군요. ;;
시간이 0으로 나오네요.
99,999,999로 한 결과도 0
별로 차이가 없는데요. 가끔 sizeof가 1000분의 1초 걸리기도 하고.. 어떤 때는 상수가 1000분의 1초 걸리기도 하고..
sizeof()는
sizeof()는 전처리자(preprocessor)가 아닙니다.
그래서 프리프로세싱때 처리되지 않고, 컴파일시에 컴파일러가 시스템에 맞게 해석하여 상수로 치환해 줍니다.
그러므로, 속도의 차이가 날 턱이 없습니다.
아하!!
그렇군요!!
답변주신분들 감사드립니다.. __);
저도 실행시간을 100만분의 1초까지 재보니 둘다 0.000003초로 정말 차이가 없군요.
컴파일 시점에 크기가 지정되는 듯 싶습니다.
그러고보니 C/C++은 실행중 타입의 크기를 변환 시킬 수 있는 방법이 없으니.. 컴파일 시점에 크기를 정해도 전혀 문제가 될게 없겠네요.
근데 _countof는 정말 어떻게 되는 건지 저도 궁금하네요.
_countof 도 당연히 상수시간이죠
vs2008 stdlib.h 소스네요...
/* _countof helper */
#if !defined(_countof)
#if !defined(__cplusplus)
#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
#else
extern "C++"
{
template
char (*__countof_helper(UNALIGNED _CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
#define _countof(_Array) sizeof(*__countof_helper(_Array))
}
#endif
#endif
댓글 달기