jugador fortnite
Estoy creando un controlador EFI y, por lo tanto, no puedo usar stdlib, por lo que no hay memset. También estoy ejecutando después de ExitBootServices, por lo que no hay edk2 CopyMem. Esta es mi función:
void Set_Memory(VOID* Dest, UINTN Len, CHAR8 Val)
{
for (int i = 0; i < Len; ++i)
{
((UINT8*)Dest)[i] = Val;
}
}
Al compilar con optimizaciones, obtengo LNK2001 unresolved external symbol memset
. Presumiblemente, el compilador MSVC está reemplazando mi llamada a Set_Memory
con una llamada a memset
. Yo tampoco puedo definir mi propio memset
porque me sale el error C2169 'memset': intrinsic function, cannot be defined
. ¿Cómo puedo evitar esto sin perder otras optimizaciones?
Utilizar el #pragma optimize("", off)
para desactivar las optimizaciones para ciertas funciones.
Por ejemplo:
#pragma optimize("", off)
void Set_Memory(VOID* Dest, UINTN Len, CHAR8 Val)
{
for (int i = 0; i < Len; ++i)
{
((UINT8*)Dest)[i] = Val;
}
}
#pragma optimize("", on)
optimize pragma
está documentado aquí
-
Sin embargo, esa no parece una solución deseable. Todavía me gustaría que la función produzca un código eficaz (por ejemplo, usando vectorización, etc., cuando sea posible), especialmente para dicha función. Simplemente no debería diferir la optimización a un
memset
implementación.– usuario17732522
5 de marzo a las 17:13
Bienvenido a Stack Overflow. Lea la página Acerca de pronto y también visite los enlaces que describen cómo hacer una pregunta y cómo crear un ejemplo mínimo completo reproducible. Proporcionar los detalles necesarios, incluidos su MCRE, las advertencias del compilador y los errores asociados, y los datos de muestra, si los hay, permitirá que todos los aquí presentes lo ayuden con su pregunta. Dicho esto, MSVC no reemplazará
Set_Memory()
conmemset()
el problema no está en lo que se publica.–David C. Rankin
5 de marzo a las 6:21
@DavidC.Rankin Reemplazará el cuerpo de la función con una llamada a memset y ese es un comportamiento común para optimizar compiladores: godbolt.org/z/5s1hxEr13
– usuario17732522
5 de marzo a las 6:58
Es pragma intrínseco y tienes que quitar el
/Oi
mejoramiento. (habilitado por defecto en VS)memset()
es un intrínseco específico usado para reemplazo. Ver también /Oi (Generar funciones intrínsecas) @user17732522 — lo encontré:)
El reemplazo significa elcl
determinadomemset()
proporcionó un mejor rendimiento y, por lo tanto, realizó el reemplazo (aunque eso no ayuda aquí)–David C. Rankin
5 de marzo a las 7:36
Esta fue una buena pregunta: aprendí algo de la pregunta en sí,
–David C. Rankin
5 de marzo a las 7:40
¿Ha intentado definir una función memset para el compilador con “#pragma function(memset)”? Esto debería hacer que el compilador use la función en lugar de su propio intrínseco.
– MiSimon
6 de marzo a las 10:25