2014-12-15 2 views
8

g ++을 사용하여 압축 필드가있는 코드를 컴파일합니다. 그러나 포장 된 필드에 대한 참조를 반환 할 때 오류가 발생합니다.포장 된 필드에 대한 참조를 반환 할 수없는 이유는 무엇입니까?

예 :

struct __attribute__((packed)) Foo { 
    int* ptr; 
    uint16_t foo; 
    int*& getPtr(){ 
     return ptr; 
    } 
}; 

오류가 산출 :

test.cpp:22:14: error: cannot bind packed field ‘((Foo*)this)->Foo::ptr’ to ‘int*&’ 
    return ptr; 

왜 나는 포장 필드에 대한 참조를 반환 할 수 있습니까?

+6

포장 된 경우 입력란이 제대로 정렬되지 않을 수 있습니다. –

+0

@ T.C .: gcc에 "나사 맞춤, x86에 관한 것"이라고 말할 수있는 방법이 있습니까? – gexicide

+1

@gexicide'return (int * &)ptr;' –

답변

2

가이 커버하는 GCC의 버그 리포트 Cannot bind packed field이며 말한다 :

The C++ spec (C++03, Sects. 3.9, 3.9.1, 3.9.2) are very clear that T and "pointer to T" have implementation-specific alignment requirements. If you have a "pointer to T" then you may assume that it meets the alignment requirements. I'm sure the C spec has similar language.

In the OP's case, the following code could violate the alignment requirements

그들은 자신의 정렬 유형을 정의 alignment 속성을 사용하여 해결 방법을 제시하지만, 그것이 작동하는 것처럼은 보이지 않는다.

+0

믿지 마라. 같은 버그 보고서를 발견하고 똑같은 견적을 올리려고했다 ... – Columbo

+0

나는 alginment 속성으로 해결 방법을 시도했다. gcc. – gexicide

+0

@gexicide "해결 방법"은 오류 메시지를 피하지만 실제로 작동하지 않는 해킹처럼 보입니다 .' getPtr'가 대신 프록시를 반환하십시오. –

관련 문제