Зачем встроенным в GCC атомам нужна дополнительная «универсальная» версия? - PullRequest
6 голосов
/ 30 октября 2019

Согласно https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html, есть:

type __atomic_load_n (type *ptr, int memorder)

и («универсальный»):

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

затем

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

и(«универсальный»)

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

и т. д.

Что общего в последних версиях (это не общее в предыдущих версиях) и зачем они нужны?

1 Ответ

3 голосов
/ 30 октября 2019

Ответ правильный в руководстве GCC в разделе 6.55 , в котором говорится:

Встроенные функции __atomic могут использоваться с любым целочисленным скалярным или указательным типом, который1, 2, 4 или 8 байтов в длину. 16-байтовые целочисленные типы также допустимы, если архитектура поддерживает __int128 (см. __Int128).

Четыре неарифметических функции (load, store, exchange и compare_exchange) имеют общую версию какЧто ж. Эта универсальная версия работает с любым типом данных. Он использует встроенную функцию без блокировки, если конкретный размер типа данных делает это возможным;в противном случае внешний вызов будет разрешен во время выполнения. Этот внешний вызов имеет тот же формат с добавлением параметра size_t, вставленного в качестве первого параметра, указывающего размер объекта, на который указывает указатель. Все объекты должны быть одинакового размера.

...