2012-02-23 2 views
0

값을 변경하지 않을 때마다 const을 엄격하게 사용하거나 데이터를 수정할 때만 포인터를 포인터로 전달하는 것이 중요하다고 생각합니까?const 또는 피연산자로 올바른 인수

올바른 일을하고 싶습니다만, 인수로 전달 된 struct 크기가 크면 데이터를 복사하는 대신 주소를 전달하고 싶지 않으십니까? 일반적으로 피연산자로 struct 인수를 선언하는 것만 큼 효과적입니다.

//line1 and line2 unchanged in intersect function 
v3f intersect(const line_struct line1, const line_struct line2); 
//"right" method? Would prefer this: 
v3f intersect2(line_struct &line1, line_struct &line2); 

답변

1
v3f intersect(const line_struct line1, const line_struct line2); 

는 라인의 양쪽 손 사본 등 intersect에 외부 동작 환산

v3f intersect(line_struct line1, line_struct line2); 

정확하게 등가이므로, 원래의 라인이 기능에 의해 수정 될 수 없다. const 형태의 함수 인 (선언하는 것이 아니라)을 구현할 때만 차이점은 있지만 외부 동작에는 없습니다.

이 양식은 그냥 포인터를 전달하기 때문에 라인을 복사 할 필요가 없습니다

v3f intersect(const line_struct *line1, const line_struct *line2); 

에서 구별된다. 이것은 C에서 선호되는 형식이며 특히 큰 구조체의 경우에 적합합니다. opaque types에도 필요합니다.

v3f intersect2(line_struct &line1, line_struct &line2); 

두 제 프로토 타입은 동일하지 C.

+0

유효하지 않다. 두 번째 함수에서는 함수 본문에서 인수를 수정할 수 있습니다. – ouah

+0

컴파일러에 따라 pass-by-value 매개 변수에 const를 적용하면 최적화에 도움이 될 수 있습니다. 컴파일러는 const 한정자를 매개 변수에 쓰기가 허용되지 않는 문으로 해석해야합니다. – Throwback1986

+0

@ouah : 당신 말이 맞아요. 그것들은 외부 행동과 동등하다고 덧붙였습니다. –

0

c에는 참조 (&)가 없습니다. C에서

, 당신의 매개 변수 유형으로 const 구조에 대한 포인터를 사용
v3f intersect(const line_struct *line1, const line_struct *line2); 

그래서 포인터 만이 전체 구조를 함수 호출에 복사되지 않습니다.