2011-02-08 3 views
3

C++에서 작업중인 대형 응용 프로그램이 있으며 인라인 함수가 잘못된 값을 반환하는 클래스가 있습니다. 그것은 하나의 항목에 의해 상쇄되는 것처럼 보입니다.잘못된 결과를 반환하는 인라인 함수

class Test 
{ 

private: 
    uint myVal1;  
    uint myVal2; 
    uint myVal3; 
    uint myVal4; 

public: 
    uint myFunct1() const { return myVal1 }; 
    uint myFunct2() const { return myVal2 }; 
}; 

우리가보고있는 것은 myFunct1이 myVal2를 반환하고 myFunct2이 myVal3를 반환한다는 것입니다 : 여기

코드 설정 방법의 예입니다. 함수를 인라인으로 만들지 않으면 모든 것이 예상대로 작동합니다.

왜 이렇게 될지에 대한 아이디어가 있습니까?

미리 감사드립니다.

+0

는 초기화되지 않은 변수 (포인터) (코드의 다른 부분)처럼 보입니다. – thbusch

+1

정말 사기스러운 것을 배제합시다. 값이 올바르게 설정되어 있는지 정말로 알고 계십니까? – Nim

+0

예 값은 올바르게 설정되고 초기화되지 않은 변수가 아닙니다. 왜냐하면 모든 멤버가 올바르게 보이고 .cpp 대신 .cpp 함수를 정의한다면 말한 것처럼 말입니다.h 파일은 모두 완벽하게 작동합니다. – JumboSmith

답변

11

(나는 당신이 위의 게시하는 것은 실제로 일부 헤더 파일의 조각이라고 가정한다.) 그런

상황이 일반적 일이 프로그램에서 다른 소스 파일이 서로 다른 메모리 레이아웃 관련 설정 컴파일 할 때처럼 클래스 패킹 및 정렬 설정. 헤더 파일은 이러한 여러 번역 단위에 포함되며 메모리 레이아웃 설정의 불일치로 인해 다르게 해석됩니다.

Test 개체를 이러한 번역 단위간에 전달하기 시작하면 문제가 발생합니다. 하나의 번역 단위는 하나의 메모리 레이아웃을 가진 Test 개체를 생성 한 다음 다른 번역 단위가 완전히 다른 메모리 레이아웃을 가정하거나 읽습니다. 귀하의 경우에는 각 번역 단위에서 다르게 해석되는 것은 인라인 함수입니다.

멤버 함수를 비 인라인 멤버로 정의하면 멤버 함수가 정의 된 소스 파일에만 해당하는 클래스 메모리 레이아웃이 있다고 가정합니다. 이것은 카펫 아래의 문제를 없애고 (액세스 기능이 이제 하나의 메모리 레이아웃에 묶여 있기 때문에) "작동"하게 만들지 만 여전히 그럼에도 불구하고 여전히 좋은 상황은 아닙니다. 그것은 여전히 ​​도로 아래 유사한 자연의 다양한 문제로 이어질 수 있습니다.

프로그램의 모든 소스 파일이 정확히 동일한 클래스 메모리 레이아웃 설정으로 컴파일되었는지 확인하십시오.

P. Fred는 주석에서 언급했듯이 번역 단위 간의 클래스 메모리 레이아웃의 불일치는 소스 파일이 의존하는 헤더 파일을 수정 한 후 소스 파일을 다시 컴파일하는 것을 잊어 버리는 것과 같은 일들로 인해 발생할 수 있습니다.

이러한 문제의 또 다른 "보편적 인"원인은 전처리 지시문 (즉, #ifdef/#endif 세그먼트로 사용자 정의 된 클래스 레이아웃)에 의존하는 클래스 정의입니다. #define 헤더 파일을 포함하는 일부 소스 파일에서 중요한 것을 잊어 버린 경우 해당 소스 파일의 클래스에 대해 다른 메모리 레이아웃이 될 수 있습니다.

+5

이것은 TU를 컴파일하고, 헤더를 수정하고, 두 번째 TU를 컴파일 한 다음 두 TU를 서로 링크합니다 (첫 번째를 다시 컴파일하지 않고). 즉 위의 상황과 내 상황 모두에 대해 빌드 시스템이 엉망입니다. 헤더 종속성을 추적하고 있는지 확인하십시오. –

+0

처럼 마지막 포장 정렬 값을 올바르게 표시하지 않는 문제가있는 것 같습니다. – JumboSmith

+0

@ JumboSmith- 동일한 문제가 있습니다. 어떻게 그걸 해결 했니? – user1166419

3

인라인 된 함수는 인라인되지 않은 함수와 동일한 결과를 가져야합니다. 그래서, 문제는 다른 곳에서, 당신이 보여주지 않는 코드에 있어야합니다. 아마 개인 회원의 가치를 마술처럼 설정 한 사람일까요?

+0

내가 그 문제를 생각하지 않는다. 내가 .cpp 파일이 아니라 .h 파일에 함수를 정의한다면, 모든 것이 잘 동작한다. – JumboSmith

+2

@JumboSmith :하지만 그 점이 차이를 만들어서는 안되기 때문에 문제는 다른 곳에서해야합니다. AndreyT의 대답은 좋은 단서가 될 것입니다. –

관련 문제