버그 해결을 위한 모든 질문을 던져
0 votes
188 views

사실 어떤 기준으로 나누냐 보다는 언제 포인터가 아닌 값 타입을 사용하는지 궁금하네요. 

물론 데이터 크기가 포인터보다 크다고 가정할 때요.

힙의 재할당은 느리고 단편화 문제도 있으니, 자주 재할당이 일어나는 객체면 값 타입으로 선언하는 걸까요?

그렇다면 한번 할당하면 끝까지 사용하는 클래스 타입의 멤버를 값 타입으로 선언할 때는 어떤 이유일까요?  

예를 들면.. 어떤 사람이 다음과 같이 선언했을 때 Mesh 클래스의 스펙? 조건?은 어떠할 것이다 라고 예상하시는 게 있을까요?

혹은 이걸 왜 값타입으로 선언했는지 이해하기 위해 어떤 걸 살펴보실껀가요?

class Model
{
...

private:
Mesh m_Mesh;
};

 

asked (23 point) , 188 views

4 answers

+1 vote
Mesh 라면 일반적으론 포인터 타입이 맞겠죠. 가지고 있는 데이터 사이즈도 크고, 하나의 Mesh를 여러 모델에서 공유해서 쓸 수 있으니까요. 또 렌더링과 관련된 데이터들은 메모리 할당이나 해제가 (16바이트 정렬 같은)특수한 경우가 많고요. 멀티스레드 접근까지도 고려해야 할 수 있죠. 그런 클래스는 별도의 리소스 관리자가 관리를 하고, Model 등 외부 클래스에서는 포인터만 얻어서 쓰는 게 낫죠.

멤버 변수로 들고 있어도 괜찮은 경우는 가지고 있는 데이터의 사이즈가 작고 단순한 경우거나 공유도 필요없을 정도로 각자가 서로 다른 값을 가지고 있는 경우 등이겠죠. 메모리 할당, 해제 방식도 특수하지 않고요.
answered (561 point)
+1 vote
저의 경우,

덩치가 작고,

사이즈 변동성이 작고,

개체 각각의 고유값일때 그냥, 값으로 많이 사용합니다

 

공유값들은 매니저에서 할당/해제

필요한 애들은 객체에서 포인터로 참조만 합니다

 

위 코드에서,

mesh 가 각각의 model 만이 가지는 고유 정보라고 할때, (공유되지않는)

mesh 안에 폴리곤정보(버텍스, 면) 이 들어있다면,

mesh 는 값으로 사용하고,

폴리곤 정보들은, 메쉬마다 사이즈 변동성이 매우 크므로,

할당/해제 사용할것 같네요,
answered (24 point)
수정됨
+1 vote
저는 primitive type이 아닌것들은 포인터를 사용하고 있습니다.

C#도 struct를 이용해 값타입으로 사용하는 방법이 있습니다만
* 잦은 힙할당으로 인한 메모리 파편화
* 해당 값의 복사
* 박/언박싱이 일어날 수 있는가
를 고려해서... 하기는 개뿔 그냥 class로 작업하고 있습니다 ㅇ<-< 누군가 제가 짠 struct를 함수 인자값으로 넘긴다던가 하는 식으로 복사할수도 있잖아요?

약간 말이 엇나갔습니다만 저는 C#의 동작방식을 흉내내서 C++을 짤때는 전부 포인터로 하고있습니다.

C#에서 걱정되는 GC도 없으니 메모리누수만 잘 신경쓴다면(혹은 자동화 한다면) 굳이 포인터를 마다할 이유는 없어보여요.
answered (282 point)
+1 vote
옛날에는 개체 생명주기랑 크기 그리고 전체 스택 할당량 고려해서 최대한 스택에 할당 되는 방식으로 짰으나
지금은 POD 타입 외의 것들은 일단 힙 할당으로 짜고 나중에 최적화 시기에 병목 있는 부분을 최적화 할 떄 할당 부분이 영향 있을 경우 스택 할당도 고려해서 맞는 상황에 바꾸고 해요
answered (14 point)

버그 해결을 위해 도움을 구하고, 도움을 주세요. 우리는 그렇게 발전합니다.

throw bug 는 프로그래밍에 대한 전분야를 다룹니다. 질문,논의거리,팁,정보공유 모든 것이 가능합니다. 프로그래밍과 관련이 없는 내용은 환영받지 못합니다.

481 질문
636 answers
613 댓글
87,238 users