다음을 통해 공유


C28651

경고 C28651: 정적 이니셜라이저는 멤버 함수 포인터로 인해 쓰기 페이지에서 복사를 발생합니다.

전역 또는 정적 const 변수의 정적 이니셜라이저는 컴파일 시간에 완전히 평가되어 RDATA에서 생성되는 경우가 많습니다. 그러나 이니셜라이저가 비정적 함수인 멤버에 대한 포인터 함수인 경우 전체 이니셜라이저가 쓰기 중 복사 페이지에 배치되어 성능 비용이 들 수 있습니다.

쓰기 페이지에서 빠른 로드 및 복사 최소화가 필요한 이진 파일의 경우 정적 이니셜라이저의 모든 함수 포인터가 포인터-멤버 함수가 아닌지 확인하는 것이 좋습니다. 멤버에 대한 포인터 함수가 필요한 경우 실제 멤버 함수에 대한 호출을 래핑하는 간단한 정적 멤버 함수를 작성합니다.

예제

다음 코드 예제에서는 이 오류를 생성합니다.

void Func()
{
    WCHAR*pszBuf=newWCHAR[MAX_PATH];
    DPA_InsertPtr(_hdpa, DA_LAST, pszBuf);
}

void CleanupDPA()
{
    int count = DPA_GetCount(_hdpa);
    for (int i = 0; i < count; i++)
{
    delete [] (LPWSTR)DPA_GetPtr(_hdpa, i);
}
}  

다음 코드 예제에서는 이 오류를 방지합니다.

class MyClass
{
    ...
    bool memberFunc();
    static bool memberFuncWrap(MyClass *thisPtr)
        { return thisPtr->memberFunc(); }
    ...
};
const StructType MyStruct[] = {
    ...
    &MyClass::memberFuncWrap,
    ...
};