지속성 및 초기화 최적화

기본적으로 컨트롤의 지속성 및 초기화는 멤버 함수에 DoPropExchange 의해 처리됩니다. 일반적인 컨트롤에서 이 함수는 각 속성에 대해 하나씩 여러 PX_ 함수(PX_ColorPX_Font등)에 대한 호출을 포함합니다.

이 방법은 초기화, 이진 형식의 지속성 및 일부 컨테이너에서 사용되는 이른바 "property-bag" 형식의 지속성에 단일 DoPropExchange 구현을 사용할 수 있다는 장점이 있습니다. 이 하나의 함수는 한 곳에서 속성 및 기본값에 대한 모든 정보를 제공합니다.

그러나 이러한 일반성은 효율성을 희생합니다. PX_ 함수는 본질적으로 더 직접적이지만 덜 유연한 접근 방식보다 효율성이 낮은 다층 구현을 통해 유연성을 얻습니다. 또한 컨트롤이 기본값을 PX_ 함수에 전달하는 경우 기본값을 반드시 사용하지 않을 수 있는 경우에도 매번 해당 기본값을 제공해야 합니다. 기본값을 생성하는 것이 사소한 작업인 경우(예: 앰비언트 속성에서 값을 가져올 때) 기본값이 사용되지 않는 경우 불필요한 추가 작업이 수행됩니다.

컨트롤의 함수를 재정의하여 컨트롤 Serialize 의 이진 지속성 성능을 향상시킬 수 있습니다. 이 멤버 함수의 기본 구현은 함수를 호출합니다 DoPropExchange . 재정의하여 이진 지속성을 위한 보다 직접적인 구현을 제공할 수 있습니다. 예를 들어 다음 DoPropExchange 함수를 고려합니다.

void CMyAxOptCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Bool(pPX, _T("BoolProp"), m_BoolProp, TRUE);
   PX_Short(pPX, _T("ShortProp"), m_ShortProp, 0);
   PX_Color(pPX, _T("ColorProp"), m_ColorProp, RGB(0xFF, 0x00, 0x00));
   PX_String(pPX, _T("StringProp"), m_StringProp, _T(""));
}

이 컨트롤의 이진 지속성의 성능을 향상시키려면 다음과 같이 함수를 재정의할 Serialize 수 있습니다.

void CMyAxOptCtrl::Serialize(CArchive& ar)
{
   SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
   SerializeExtent(ar);
   SerializeStockProps(ar);

   if (ar.IsLoading())
   {
      ar >> m_BoolProp;
      ar >> m_ShortProp;
      ar >> m_ColorProp;
      ar >> m_StringProp;
   }
   else
   {
      ar << m_BoolProp;
      ar << m_ShortProp;
      ar << m_ColorProp;
      ar << m_StringProp;
   }
}

로컬 변수를 dwVersion 사용하여 로드 또는 저장되는 컨트롤의 영구 상태 버전을 검색할 수 있습니다. CPropExchange::GetVersion을 호출하는 대신 이 변수를 사용할 수 있습니다.

BOOL 속성에 대한 영구 형식으로 약간의 공간을 저장하고(생성된 형식PX_Bool과 호환되도록) 다음과 같이 속성을 BYTE저장할 수 있습니다.

if (ar.IsLoading())
{
   BYTE bTmp;
   ar >> bTmp;
   m_BoolProp = (BOOL)bTmp;
   // other properties...
}
else
{
   ar << (BYTE)m_BoolProp;
   // other properties...
}

로드 사례에서 임시 변수가 사용되며 해당 값은 m_boolProp BYTE 참조로 캐스팅하는 대신 할당됩니다. 캐스팅 기술을 사용하면 1바이트의 m_boolProp 수정되고 다시 기본 바이트는 초기화되지 않습니다.

동일한 컨트롤의 경우 다음과 같이 COleControl::OnResetState를 재정의하여 컨트롤의 초기화를 최적화할 수 있습니다.

void CMyAxOptCtrl::OnResetState()
{
   ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
   ResetStockProps();

   m_BoolProp = TRUE;
   m_ShortProp = 0;
   m_ColorProp = RGB(0xFF, 0x00, 0x00);
   m_StringProp.Empty();
}

OnResetState 재정 Serialize 의되었지만 속성 모음 형식의 DoPropExchange 지속성에 계속 사용되므로 함수는 그대로 유지되어야 합니다. 컨테이너에서 사용하는 지속성 메커니즘에 관계없이 컨트롤이 해당 속성을 일관되게 관리하도록 하려면 이러한 세 함수를 모두 기본 것이 중요합니다.

참고 항목

MFC ActiveX 컨트롤: 최적화