Por que os componentes atômicos do GCC precisam de uma versão "genérica" ​​adicional?

8

De acordo com https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html , há:

type __atomic_load_n (type *ptr, int memorder)

e (o "genérico"):

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

então

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

e ("o genérico")

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

etc.

O que é genérico nas últimas versões (não é genérico nas anteriores) e por que elas são necessárias?

PSkocik
fonte

Respostas:

4

A resposta está correta no manual do GCC na seção 6.55 , que diz:

Os componentes internos '__atomic' podem ser usados ​​com qualquer escalar integral ou tipo de ponteiro com 1, 2, 4 ou 8 bytes de comprimento. Tipos integrais de 16 bytes também são permitidos se '__int128' (consulte __int128) for suportado pela arquitetura.

As quatro funções não aritméticas (carregar, armazenar, trocar e comparar_exchange) também possuem uma versão genérica. Esta versão genérica funciona em qualquer tipo de dados. Ele usa a função interna sem bloqueio, se o tamanho específico do tipo de dados possibilitar isso; caso contrário, uma chamada externa é deixada para ser resolvida em tempo de execução. Essa chamada externa é do mesmo formato, com a adição de um parâmetro 'size_t' inserido como o primeiro parâmetro, indicando o tamanho do objeto que está sendo apontado. Todos os objetos devem ter o mesmo tamanho.

John Szakmeister
fonte
Ainda me parece que não deve haver duas versões para isso. Certamente, com funções, seria sensato pegar objetos grandes por referência, mas esses são componentes internos do compilador. Um compilador deve poder usar ponteiros internamente, quando necessário, sem precisar incomodar os usuários com duas APIs.
PSkocik
1
@PSkocik encolhe os ombros Estou certo de que há alguma razão por que eles escolheram não fazer isso (as equipes de compiladores geralmente têm algum tipo de política por trás de escolher um mecanismo em detrimento de outro). Se você estiver realmente curioso, recomendamos que você entre em contato com a comunidade gcc (através da lista gcc - consulte a página das listas de discussão ). Já faz um tempo desde que interagi com a comunidade gcc, mas as achei agradáveis ​​e úteis no passado.
John Szakmeister