En C, ¿cuáles son exactamente los beneficios de rendimiento que se obtienen al observar el estricto aliasing?Beneficios de rendimiento del aliasing estricto
Respuesta
Hay una página que describe alias muy a fondo here.
También hay algunos temas SO here y here.
En resumen, el compilador no puede asumir el valor de los datos cuando dos punteros de tipos diferentes acceden a la misma ubicación (es decir, debe leer el valor cada vez y, por lo tanto, no puede realizar optimizaciones).
Esto solo ocurre cuando no se aplica el alias estricto. Opciones de alias estrictas:
- gcc: -fstrict-aliasing [por defecto] y -fno-estricta-aliasing
- msvc: aliasing estricto está desactivada por defecto. (Si alguien sabe cómo encenderlo, favor dilo.)
Ejemplo
Copiar y pegar este código en main.c:
void f(unsigned u)
{
unsigned short* const bad = (unsigned short*)&u;
}
int main(void)
{
f(5);
return 0;
}
Entonces compile el código con estas opciones:
main.c gcc -Wall -O2
y obtendrá:
main.c: 3: advertencia: eliminación de referencias de tipo hizo juegos de palabras puntero se romperá estricta-aliasing reglas
aliasing Desactivar con:
gcc mAIN.C -fno-estrictas-alias ing -Wall -O2
Y la advertencia desaparece. (O simplemente elimine -Wall pero ... no lo compile sin él)
Intente como podría No pude obtener MSVC para darme una advertencia.
- 1. Estricto aliasing y std :: array vs C-style array
- 2. Impacto de rendimiento de -fno-strict-aliasing
- 3. Simultaneidad o rendimiento Beneficios del rendimiento sobre la devolución de una lista
- 4. ¿Hay algún tipo de "modo de rendimiento estricto" para MySQL?
- 5. advertencia aliasling estricto de gcc 4.6.1 fallo
- 6. ¿Qué es el aliasing y cómo afecta el rendimiento?
- 7. Aliasing del puntero de matriz: ¿comportamiento indefinido?
- 8. Beneficios del esquema de aprendizaje?
- 9. Beneficios del plugin Maven FailSafe
- 10. C99 reglas estrictas de aliasing en C++ (GCC)
- 11. MongoDB: beneficios del uso de objetos incrustados
- 12. los beneficios de awakeFromNib?
- 13. "desreferencia puntero tipo punteado romperá reglas de alias estricto" advertencia
- 14. C superar las restricciones de aliasing (? Sindicatos)
- 15. Uso sobrecargado del rendimiento rendimiento
- 16. Anti-aliasing en OpenGL
- 17. Anti-aliasing de impresión Silverlight
- 18. ¿Cuándo es seguro * para el alias de puntero estricto?
- 19. Rendimiento de rendimiento del rendimiento: en Smalltalk (específicamente Squeak)
- 20. Alias de puntero estricto: ¿alguna solución para un problema específico?
- 21. Modo estricto en PHP?
- 22. Técnicas para aliasing en C#?
- 23. Beneficios de matrices
- 24. ¿FILTER_VALIDATE_URL es demasiado estricto?
- 25. ¿De dónde habla la norma sobre aliasing?
- 26. En ECMAScript5, ¿cuál es el alcance del "uso estricto"?
- 27. PDO ¿Auto aliasing when fetching?
- 28. rieles I18n varios archivos aliasing
- 29. CSS: @ font-face anti aliasing
- 30. Rendimiento del rendimiento anidado en un árbol
+1, pero deje en claro que el compilador no puede hacer esa suposición cuando el alias * estricto * no * se observa. –
¡Perfecto! :) Desafortunadamente, MSVC++ no parece tener una opción para el alias estricto. Sin embargo, tiene __restrict y __declspec (restrict), que se pueden usar en casos individuales. –
Parece un error tipográfico "-fno-strict-aliasing [predeterminado] y -fno-strict-aliasing" Supongo que el valor predeterminado es en realidad -fstrict-aliasing (al menos en GCC moderno) en lugar de -fno-strict- aliasing, pero en cualquier caso una de las dos opciones de GCC enumeradas debería ser -fstrict-aliasing, y ahora ambos dicen -fno-strict-aliasing. – tialaramex