Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
avertissement C28651 : l’initialiseur statique provoque la copie sur des pages d’écriture en raison de pointeurs de fonction membre
Les initialiseurs statiques des variables const globales ou statiques peuvent souvent être entièrement évalués au moment de la compilation, ce qui est généré dans RDATA. Toutefois, si un initialiseur est une fonction pointeur à membre où il s’agit d’une fonction non statique, l’initialiseur entier peut être placé dans des pages de copie en écriture, ce qui a un coût de performances.
Pour les fichiers binaires qui nécessitent un chargement et une réduction rapides de la copie sur les pages d’écriture, veillez à ce que tous les pointeurs de fonction dans l’initialiseur statique ne soient pas des fonctions pointeurs à membre. Si une fonction pointeur à membre est requise, écrivez une fonction membre statique simple qui encapsule un appel à la fonction membre réelle.
exemple de
L’exemple de code suivant génère cette erreur.
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);
}
}
L’exemple de code suivant évite cette erreur.
class MyClass
{
...
bool memberFunc();
static bool memberFuncWrap(MyClass *thisPtr)
{ return thisPtr->memberFunc(); }
...
};
const StructType MyStruct[] = {
...
&MyClass::memberFuncWrap,
...
};