gcc 에서 최적화 옵션을 키고 컴파일시 문제..

fivestar의 이미지

gcc 최적화 옵션을 사용한 퍼포먼스를 비교해보고 싶어서

-O2 옵션을 주려고 하는데

컴파일시 expected identifier or ‘(’ before ‘__extension__` 에러가 발생하네요

해당 라인의 소스는 extern u_int32_t ntohl(u_int32_t x); 입니다.

최적화 옵션 없이 컴파일시 문제가 없지만 최적화 옵션 활성화시 위와 같은 문제가 발생하는 이유좀 알려주시면

감사하겠습니다 :)

fivestar의 이미지

참고로 -O1 때도 문제가 발생하더군요..

empty2fill의 이미지

extern u_int32_t ntohl(u_int32_t x);

을 삭제하고

#include <arpa/inet.h>

를 추가해보세요.

O2 최적화시 ntohl 매크로가 확장되면서 문제가 되는거 같습니다.

--------------------------------
1. 테스트 소스 코드
test.c

#include <arpa/inet.h>
 
extern u_int32_t ntohl(u_int32_t x);
 
int
main()
{
    return ntohl(10);
}

2. 최적화 할 때(O2)
gcc -O2 -E test.c

# 3 "test.c" 2
extern u_int32_t (__extension__ ({ register unsigned int __v, __x = (u_int32_t x); if (__builtin_constant_p (__x)) __v = ((((__x) & 0xff000000) >> 24) | (((__x) & 0x00ff0000) >> 8) | (((__x) & 0x0000ff00) << 8) | (((__x) & 0x000000ff) << 24)); else __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); __v; }));
 
int
main()
{
 return (__extension__ ({ register unsigned int __v, __x = (10); if (__builtin_constant_p (__x)) __v = ((((__x) & 0xff000000) >> 24) | (((__x) & 0x00ff0000) >> 8) | (((__x) & 0x0000ff00) << 8) | (((__x) & 0x000000ff) << 24)); else __asm__ ("bswap %0" : "=r" (__v) : "0" (__x)); __v; }));
}

3. 최적화 안할 때
gcc -E test.c

# 2 "test.c" 2
 
extern u_int32_t ntohl(u_int32_t x);
 
int
main()
{
 return ntohl(10);
}

——
———
Life is a tragedy when seen in close-up, but a comedy in long-shot. - Chaplin, Charlie -