2012-01-29 27 views
8

Con trỏ thông minh là con trỏ bên dưới, vì vậy có cách nào để xác định tham số shared_ptr cho hàm không phải là răng cưa khác shared_ptr hoặc con trỏ khác thuộc loại nào không?Có thể áp dụng __restrict__ cho shared_ptr <T> không?

Hoặc vì lý do nào đó, không cần thiết?

Tôi quan tâm đến trình biên dịch gcc> = 4.2 và llvm-clang> = 2.0 (câu trả lời cho các trình biên dịch khác cũng sẽ thú vị).

+0

C++ không có bất kỳ từ khóa 'hạn chế' hoặc' __restrict__' nào. Nếu bạn đang hỏi về các phần mở rộng ngôn ngữ trong một trình biên dịch cụ thể, bạn cần phải nói. –

+0

@BenVoigt xin lỗi - được làm rõ trong chỉnh sửa. – James

+3

Có vẻ như không chắc rằng một finction muốn làm việc trên con trỏ bị hạn chế muốn yêu cầu quyền sở hữu chung của con trỏ. Chưa kể rằng trong một hệ thống với quyền sở hữu chia sẻ, bạn sẽ biết rằng con trỏ thực sự khác biệt. Trong mọi trường hợp, tôi đoán hàm của bạn actualky muốn dùng con trỏ [bị giới hạn] thay vì 'std :: shared_ptr ' s. –

Trả lời

7

Chỉ cần trích xuất con trỏ với .get() và đánh dấu chúng là __restrict__. Hãy nhớ rằng, đặt __restrict__ vào các tham số chức năng giống như đặt __restrict__ trên các biến cục bộ. Đặc biệt, trình biên dịch không cố ngăn bạn gọi hàm bằng hai con trỏ rõ ràng trỏ đến cùng một đối tượng; ví dụ. foo(i,i).

Nếu bạn muốn thực hiện một lời hứa để trình biên dịch rằng con trỏ nhất định không tham khảo lẫn nhau, cho phép trình biên dịch để làm nhiều việc tối ưu, sau đó sử dụng mã này dưới đây và làm các hoạt động của bạn thông qua xpyp thay vì xy .

#include<iostream> 
#include<memory> 
using namespace std; 

void foo(shared_ptr<int> x, shared_ptr<int> y) { 
     int * __restrict__ xp = x.get(); 
     int * __restrict__ yp = y.get(); 
} 

int main() { 
     shared_ptr<int> i = make_shared<int>(3); 
     shared_ptr<int> j = make_sharet<int>(4); 
     foo(i,j); 
} 
+2

Tại sao bạn nói rằng việc đánh dấu các tham số hàm như 'limits' là khác nhau để khai báo các biến con trỏ' limits' cục bộ? Đó là một cái gì đó để làm với 'gcc' tối ưu hóa hoặc là nó một hành vi cơ bản của' hạn chế' (mà tôi hiện không hiểu;)) –

+0

Tôi nói đó là * không * khác nhau. Tôi sẽ cố gắng viết lại nó để rõ ràng hơn. –

+0

Tôi sẽ viết điều này, nhưng tôi không thể tìm thấy bất kỳ ngữ pháp nào cho '__restrict__' cho biết liệu nó có được phép trên các biến cục bộ hay không. Có tài liệu ở đâu đó không? –

5

Nếu bạn muốn thực hiện các hoạt động phi-aliased trên đối tượng cơ bản gắn liền với một con trỏ chia sẻ bạn một cách rõ ràng có thể uỷ thác cho một thói quen lao động mà phải mất một tham số con trỏ phi-aliased:

void worker (mytype *__restrict x, mytype *__restrict y) 
{ 
    // do something with x, y with a no-alias guarantee 
} 

int main() 
{ 
    std::shared_ptr<mytype> p(new mytype); 
    std::shared_ptr<mytype> q(new mytype); 

// explicitly delegate the shared object 
    worker(p.get(), q.get()); 

    return 0; 
} 

Tôi không chắc chắn chính xác những gì bạn có trong tâm trí, nhưng điều này sẽ cho phép quản lý bộ nhớ cấp cao được xử lý an toàn bằng con trỏ thông minh, trong khi thực hiện công việc mức thấp có thể là hiệu quả hơn với con trỏ không có bí danh.

Như @BenVoigt chỉ ra, restrict chỉ là một phần chính thức của c99 - c++ không phải là nghĩa vụ phải biết gì về nó. MSVC vẫn hỗ trợ nó qua __restrict và như bạn đã nói GCC__restrict__.

Hy vọng điều này sẽ hữu ích.

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