Почему std :: atomic_fetch принимает указатель в качестве входного параметра - PullRequest
0 голосов
/ 28 апреля 2018

Набор свободных функций для std::atomic_fetch_xxx (или, и, добавить, sub, xor) , принять в качестве ввода std::atomic<T>* с именем obj:

template< class T >
T atomic_fetch_sub(std::atomic<T>* obj,
                   typename std::atomic<T>::difference_type arg ) noexcept;

Вопрос: Почему тип std :: atomic берется как указатель, а не передается как ссылка, например:

T atomic_fetch_sub(std::atomic<T>& obj,
                   typename std::atomic<T>::difference_type arg ) noexcept;

Есть ли практическая рациональная причина или просто стилистическая?

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Эти бесплатные функции существуют для того, чтобы приложения могли компилироваться как C или C ++ без изменения большей части кода. Принимая указатель, вызов свободной функции будет выглядеть как atomic_fetch_add(var, ...). По этой же причине atomic_int существует в C ++, хотя его определение отличается от версии C.

C11 достигает такого рода перегрузки функций с помощью универсальных макросов выбора . atomic_fetch_add в C не является функцией; это макрос, который выбирает функцию для вызова в зависимости от типа одного из ее параметров.

0 голосов
/ 28 апреля 2018

Вся идея , имеющего свободных функций, заключается в совместимости с C. Вы можете довольно легко импортировать код C в C ++ и заставить его работать там же (или наоборот).

Если вы не хотите, чтобы вы могли вместо этого использовать функции-члены - везде использовать ссылки - например, obj.fetch_sub(arg) или даже obj -= arg с использованием перегрузки операторов.

Но тогда код будет только C ++.

0 голосов
/ 28 апреля 2018

Почему std :: atomic_fetch принимает указатель в качестве входного параметра

atomic_fetch_sub должен иметь возможность обновлять значение первого параметра (в случае сбоя), что требует, чтобы первый аргумент передавался либо указателем, либо ссылкой.

Был выбран указатель, чтобы сделать его совместимым с интерфейсом C.

...