2013-02-13 37 views
13

Tôi đang cố gắng tăng tốc chương trình bằng cách sử dụng lệnh std :: async. Giả sử tôi có hàmTại sao std :: async sao chép const & đối số của nó?

T* f (const T& t1, const T& t2, const T& t3) 

Trường hợp T là loại tốn kém để sao chép. Tôi có một số cuộc gọi độc lập của f với các đối số khác nhau và tôi cố gắng để song song chúng với std :: async khoảng như thế này: (nơi m_futures là một std :: vector của tương lai của các loại chính xác).

for (...) { 
    m_futures.push_back (
     std::async(
      std::launch::async, 
      f, 
      a,b,c)); 
} 

Tôi đã quan sát thấy mã ở trên làm chậm quá trình thực thi chương trình của tôi. Tôi bước qua nó với gdb và khi tương lai được tạo ra, người tạo bản sao của T được gọi là ba lần. Tại sao vậy? Các đối số a, b, c là đống phân bổ, nhưng có lẽ trình biên dịch không biết về nó? Tôi có thể làm cho nó rõ ràng bằng cách nào đó?

Có phải luôn luôn trường hợp std :: async tạo bản sao của đối số, ngay cả khi chúng phải được chuyển bởi tham chiếu const? Tôi có thể tránh điều này bằng cách nào đó không? Trong tâm trí ngây thơ của tôi, chỉ nên có một con trỏ đi qua xung quanh để các invocations khác nhau của hàm (mà chỉ đọc từ bộ nhớ anyway.) Tôi đang sử dụng gcc-4.6.3 trên Linux nếu có vấn đề.

Trả lời

19

Sẽ không an toàn khi chỉ lưu trữ tài liệu tham khảo vì không có gì để đảm bảo sự vắng mặt của các cuộc đua dữ liệu (và sâu sắc hơn, chỉ tồn tại đối tượng, như @utapistim đã nói trong bài đăng đã xóa của cô ấy).

Nếu bạn thực sự muốn có một tài liệu tham khảo chứ không phải là một bản sao, và bạn 'tái sẵn sàng đặt cược cuộc sống của bạn về vấn đề này là đúng, sau đó bạn chỉ có thể sử dụng một wrapper tham khảo:

std::async(std::launch::async, f, std::cref(a), std::cref(b), std::cref(c)) 
+1

Ra khỏi tò mò, nếu tôi thay đổi giao diện và chuyển một con trỏ một cách rõ ràng thì sao? Điều đó có tương đương với việc sử dụng trình bao bọc tham chiếu không? – Thomas

+0

@Thomas: Có. Trình bao bọc tham chiếu * là * về cơ bản là con trỏ. Không sử dụng con trỏ khỏa thân trong C++ (ngoại trừ thành viên lớp riêng). Ưu tiên trình bao bọc tham chiếu. –

+0

OK, Cảm ơn, tôi không biết về gói tham chiếu. – Thomas

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