Por qué y cómo se __attribute__
utilizan en los programas de GNU C?__attribute__ en GNU C
Respuesta
Un uso es para hacer cumplir la alineación de memoria de variables y miembros de la estructura. Por ejemplo
float vect[4] __attribute__((aligned(16)));
se asegurará de que vect
serán colocados en un límite de memoria de 16 bytes. No sé si eso es un gcc-ismo o más generalmente aplicable.
el compilador normalmente sólo alineado vect
en un límite de 4 bytes. Con una alineación de 16 bytes, se puede usar directamente con las instrucciones de carga de SIMD donde lo cargarías en un registro de 128 bits que permite la suma, la resta, los productos de puntos y todo tipo de operaciones vectoriales.
A veces se quieren alineación de modo que una estructura puede ser superpuesta directamente sobre los registros de hardware asignados en memoria. O tiene que estar alineado para que el hardware pueda escribir en él y usar directamente un mecanismo de acceso directo a la memoria (DMA).
¿Por qué se utiliza en los programas de C? Para limitar su portabilidad.
Comienza con un doble guión bajo, por lo que está en el espacio de nombres del implementador; no es algo definido por el estándar de idioma, y cada proveedor del compilador puede usarlo libremente para cualquier propósito.
Edit: ¿Por qué se usa en los programas GNU C? Vea las otras respuestas que abordan esto.
Para lo que los compiladores comparables de GCC y GCC usan __attribute__
la mayoría de los otros compiladores usan #pragma
directivas.
creo que la solución de GCC es mejor ya que el comportamiento requerido de un reconocido #pragma
es ignorarlo, mientras que si se utiliza un compilador que no entiende una especificación __attribute__
, no se compilará - que generalmente es mejor, ya que entonces sabe lo que necesita transportar
Las especificaciones de atributos se utilizan para especificar aspectos de tipos, datos y funciones como el almacenamiento y la alineación que no se pueden especificar con C. A menudo son específicos del destino, principalmente no son portátiles, sin duda entre compiladores y, a menudo, entre objetivos . Evite su uso, excepto cuando sea absolutamente necesario para la función correcta del código.
- 1. Visual C++ equivalente de __attribute__ de GCC ((__packed__))
- 2. Intercambio atómico en GNU C++
- 3. Firmeza de enum en C/C99/C++/C++ x/GNU C/GNU C99
- 4. Paréntesis desequilibrado con __attribute__ en g ++
- 5. Mensajes de error GNU C++
- 6. Ayuda para implementar GNU Readline en C
- 7. expected '=', ',', ';', 'asm' o '__attribute__' before '.' token
- 8. SSE SSE2 y SSE3 para GNU C++
- 9. ncurses novatos - comenzando con GNU C
- 10. Gnu C++ macro __cplusplus estándar conformes?
- 11. C++: ¿Qué parámetros de GNU G ++?
- 12. __attribute__ ((obsoleto)) no funciona en los métodos de protocolo objetivo-c?
- 13. ¿Se ha ignorado __attribute__ ((__packed__)) en una declaración typedef?
- 14. Captura de pulsaciones de teclas en GNU/Linux en C
- 15. Diferencias entre GNU C++ y Microsoft Visual C++
- 16. Registro de activación en GNU C (función anidada)
- 17. Cómo usar punto flotante decimal en Gnu C++ (g ++)?
- 18. error de iphone: esperado '=', ',', ';', 'asm' o '__attribute__' antes '' foo '
- 19. pragma pack (1) ni __attribute__ ((aligned (1))) works
- 20. ¿Hay un equivalente portátil de __attribute__ (puro) de gcc?
- 21. Boost bjam versus GNU make
- 22. Opción GNU make --jobs en QMAKE
- 23. portátil C++ intercambio atómica (Windows - GNU/Linux - MacOSX)
- 24. Cómo usar GNU gettext con MS Visual C++?
- 25. Envoltura de funciones C++ con el enlazador GNU
- 26. GNU ld quita la sección
- 27. GUI para un depurador GNU
- 28. Completo tutorial gnu make/gcc
- 29. Referencia a GNU C (POSIX) DLL integrado en GCC contra Cygwin, de C#/NET
- 30. GNU C++ cómo verificar cuándo -std = C++ 0x está en efecto?
Mientras que estos enlaces son útiles, esta respuesta por sí solo no proporciona ninguna información. –