Bagikan melalui


C28651

peringatan C28651: Inisialisasi statis menyebabkan penyalinan pada halaman tulis karena penunjuk fungsi anggota

Inisialisasi statis variabel konstan global atau statis sering kali dapat dievaluasi sepenuhnya pada waktu kompilasi, sehingga dihasilkan dalam RDATA. Namun jika ada penginisialisasi adalah fungsi pointer-to-member yang merupakan fungsi non-statis, seluruh penginisialisasi dapat ditempatkan di halaman copy-on-write, yang memiliki biaya performa.

Untuk biner yang memerlukan pemuatan cepat dan meminimalkan salinan pada halaman tulis, pertimbangkan untuk memastikan semua penunjuk fungsi dalam penginisialisasi statis bukan fungsi pointer-to-member. Jika fungsi pointer-to-member diperlukan, tulis fungsi anggota statis sederhana yang membungkus panggilan ke fungsi anggota yang sebenarnya.

Contoh

Contoh kode berikut menghasilkan kesalahan ini.

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);
}
}  

Contoh kode berikut menghindari kesalahan ini.

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