C에서 트리를 구현했으며 이제 래퍼 트리 집합을 정의하려고합니다. tree.c에 반복자를 얻을 수GCC 최적화 도구를 사용하는 초기화되지 않은 경고
typedef struct tree_iter_t {
void *current;
tree_t *tree;
unsigned char info : 2;
} tree_iter_t;
및 기능 : 나는 tree.h 내 나무에 대한 반복자를
tree_iter_t titerator(tree_t *t) {
tree_iter_t it;
it.current = t->min;
if (t->min) it.info = 0;
else it.info = 3;
it.tree = t;
return it;
}
내가 경고없이 -Wall -O2
로이 컴파일 할 수 있습니다.
typedef struct tset_t tset_t;
typedef struct tset_iter_t {
tree_iter_t iter;
} tset_iter_t;
와 함수가 tset.c. 그것을 얻기 위해 다음과 같이 내 트리 세트, 나는 tset.h 내 트리 세트 반복자를 정의 내가 gcc -Wall -c -combine tset.c tree.c
컴파일 할 때
struct tset_t {
tree_t *tree;
};
tset_iter_t tsiterator(tset_t *ts) {
tset_iter_t it;
it.iter = titerator(ts->tree);
return it;
}
, 나는 아무런 문제가 없지만, 내가 -O2
를 추가 할 때, 나는 return 문에 경고를 얻을 : warning: ‘it.iter.tree’ is used uninitialized in this function
합니다. 왜 GCC는 이것에 문제가 있습니까? 나는 명백한 것을 놓치고 있는가? 그것은 나에게 초기화 된 것 같습니다. 내가 무슨 일이 있었는지의 감각을 얻으려고하는 gcc -S -O2 tset.c
를 실행, GCC는 경고를주지 않았다이 제작 :
tsiterator:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $36, %esp
movl 12(%ebp), %edx
movl 8(%ebp), %ebx
leal -20(%ebp), %eax
movl (%edx), %edx
movl %eax, (%esp)
movl %edx, 4(%esp)
call titerator
movzbl -12(%ebp), %edx
movzbl 8(%ebx), %eax
andl $3, %edx
andl $-4, %eax
orl %edx, %eax
subl $4, %esp
movb %al, 8(%ebx)
movl -16(%ebp), %eax
movl %eax, 4(%ebx)
movl -20(%ebp), %eax
movl %eax, (%ebx)
movl %ebx, %eax
movl -4(%ebp), %ebx
leave
ret $4
내가 최적화 이상한 보이는 코드를하지만, 도대체 여기서 무슨 일이 일어나고 있는지를 생성 할 수 있습니다 알아! ? 다른 모든 (최적화 된) 래퍼 함수는 10-ish 회선 (tree 함수를 호출하기위한 일반적인 함수 호출 오버 헤드)입니다. gcc -O2 -S -combine tset.c tree.c
나에게 경고, 인라인 titerator을주고,이 생산 :
tset_iter_t tsiterator(tset_t *ts) {
tset_iter_t it;
tree_iter_t i = titerator(ts->tree);
it.iter = i;
return it;
}
가 더 문제가 없었다 : I가 구현을 변경
tsiterator:
pushl %ebp
movl %esp, %ebp
movl 12(%ebp), %edx
pushl %ebx
movl 8(%ebp), %eax
movl (%edx), %ecx
movl 4(%ecx), %edx
movl %ecx, 4(%eax)
cmpl $1, %edx
movl %edx, (%eax)
movzbl 8(%eax), %edx
sbbl %ebx, %ebx
andl $3, %ebx
andl $-4, %edx
orl %ebx, %edx
movb %dl, 8(%eax)
popl %ebx
popl %ebp
ret $4
. 첫 번째 경우에서 GCC가 최적화 (또는 분석)되는 이유는 무엇입니까?
감사합니다.
'tree_iter_t it;'그리고'it.tree = t;'. 'it.tree'는 어디에 있습니까? 왜 진짜 코드를 게시하지 않는거야? – cnicutar
첫 번째 코드 블록에서 * t * tree 여야합니까? –
오타. 나는 그것을 고쳤다. – Nick