Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
waarschuwing C28651: Statische initialisatiefunctie veroorzaakt kopie op schrijfpagina's vanwege puntwijzers voor lidfuncties
Statische initialisaties van globale of statische const-variabelen kunnen vaak volledig worden geëvalueerd tijdens het compileren, dus gegenereerd in RDATA. Als een initialisatiefunctie echter een pointer-to-member-functie is waarbij het een niet-statische functie is, kan de volledige initialisatiefunctie worden geplaatst op kopieer-op-schrijfpagina's, die een prestatiekosten hebben.
Voor binaire bestanden waarvoor snel laden en het minimaliseren van kopiëren op schrijfpagina's is vereist, kunt u ervoor zorgen dat alle functiepointers in de statische initialisatiefunctie geen aanwijzer-naar-lid-functies zijn. Als een aanwijzer-naar-lid-functie is vereist, schrijft u een eenvoudige statische lidfunctie waarmee een aanroep naar de werkelijke lidfunctie wordt verpakt.
voorbeeld
In het volgende codevoorbeeld wordt deze fout gegenereerd.
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);
}
}
In het volgende codevoorbeeld wordt deze fout voorkomen.
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};