2017-09-19 20 views
8

Tôi đồng ý câu trả lời trong When to use references vs. pointers.
Nhưng, tôi tự hỏi tại sao C++ định nghĩa atomic_load nhưC++ tại sao loại tham số của atomic_load là con trỏ thay vì tham chiếu?

template<class T> 
T atomic_load(const std::atomic<T> *obj) noexcept; 
           ^

thay vì

template<class T> 
T atomic_load(const std::atomic<T> &obj) noexcept; 
           ^

bất cứ ai có thể giúp tôi?

+6

Nhiều khả năng cho đồng nhất với [tương đương Giao diện C] (http://en.cppreference.com/w/c/atomic/atomic_load). – WhiZTiM

+0

@WhiZTiM Nhưng, std :: nguyên tử là một mẫu lớp, tại sao nó cần phải phù hợp với C? – Caesar

+1

Nó không phải là hoàn toàn cần thiết, nó là một tiện lợi cho lập trình viên, những người không phải nhớ thêm một sự khác biệt vô nghĩa. Bạn chỉ cần nhớ rằng 'atomic_load' lấy một con trỏ, bất kể loại cơ sở chính xác bạn đang truyền. –

Trả lời

10

Lý do tại sao chúng tôi có những chức năng mẫu miễn phí tại tất cả là khả năng tương thích với nguồn C11:

#ifdef __cplusplus 
#include <atomic> 
#define _Atomic(X) std::atomic<X> 
#else 
#include <stdatomic.h> 
#endif 

_Atomic(int) c; 

int get_c(void) { 
    return atomic_load(&c); 
} 

C không có tài liệu tham khảo.

Nếu bạn không cần điều đó, thì c.load() hoặc chuyển đổi ẩn thành T sẽ hoạt động tốt. Chỉ cần quên rằng chức năng miễn phí đã từng tồn tại.

(Đây cũng là lý do tại sao phiên bản memory_order của mẫu chức năng miễn phí được gọi là atomic_load_explicit:. _Generic macro -powered trong C có thể xử lý khác nhau loại đối số, nhưng không thay đổi arity)

Các vấn đề liên quan