¿Por qué los componentes atómicos del CCG necesitan una versión "genérica" ​​adicional?

8

De acuerdo con https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html , hay:

type __atomic_load_n (type *ptr, int memorder)

y (el "genérico"):

void __atomic_load (type *ptr, type *ret, int memorder)

entonces

void __atomic_store_n (type *ptr, type val, int memorder)

y ("el genérico")

void __atomic_store (type *ptr, type *val, int memorder)

etc.

¿Qué es genérico en las últimas versiones (eso no es genérico en las anteriores) y por qué son necesarias?

PSkocik
fuente

Respuestas:

4

La respuesta está en el manual de GCC en la sección 6.55 , que dice:

Las incorporaciones '__atómicas' se pueden usar con cualquier tipo escalar o puntero integral que tenga una longitud de 1, 2, 4 u 8 bytes. Los tipos integrales de 16 bytes también están permitidos si '__int128' (consulte __int128) es compatible con la arquitectura.

Las cuatro funciones no aritméticas (cargar, almacenar, intercambiar y compare_exchange) también tienen una versión genérica. Esta versión genérica funciona en cualquier tipo de datos. Utiliza la función incorporada sin bloqueo si el tamaño de tipo de datos específico lo hace posible; de lo contrario, se deja resolver una llamada externa en tiempo de ejecución. Esta llamada externa tiene el mismo formato con la adición de un parámetro 'size_t' insertado como el primer parámetro que indica el tamaño del objeto al que se apunta. Todos los objetos deben ser del mismo tamaño.

John Szakmeister
fuente
Todavía me parece que no debería haber necesidad de tener dos versiones para esto. Claro, con funciones, sería aconsejable tomar grandes objetos por referencia, pero estos son compiladores incorporados. Un compilador debería poder usar punteros internamente donde sea necesario sin tener que molestar a los usuarios con dos API.
PSkocik
1
@PSkocik se encoge de hombros Estoy seguro de que hay alguna razón detrás de por qué decidieron no hacer eso (los equipos compiladores generalmente tienen algún tipo de política detrás de por qué eligen un mecanismo sobre otro). Si realmente tiene curiosidad al respecto, le animo a que se comunique con la comunidad de gcc (a través de su lista de gcc; consulte la página de listas de correo ). Ha pasado un tiempo desde que he interactuado con la comunidad gcc, pero los he encontrado agradables y útiles en el pasado.
John Szakmeister