2010-05-01 26 views
11

Có cách nào để xác định bằng cách sử dụng loại tích phân typedef/float mà ngụ ý không có bí danh?C/C++ __restrict loại

một cái gì đó tương đương với (nhưng cấu trúc nguyên thủy):

template < typename T > 
struct restrict { T* __restrict data; }; 

câu hỏi như có liên quan, là nó có thể hỏi gcc gì nó quyết định bí danh/no bí danh của con trỏ là gì?

+0

Tôi đoán, nó biên dịch nếu tôi gõ 'typedef const double * __restrict type;' nhưng nó có tạo giới hạn gấp đôi * hay một số loại hạn chế được áp dụng cho 'type' không? – Anycorn

+0

Hãy thử xem. 'limits' không được định nghĩa bởi chuẩn C++ để ymmv. Nếu tôi nhớ lại trải nghiệm của chính mình, giới hạn sẽ tham gia vào typedefs trong GCC. – Potatoswatter

+0

@P làm cách nào tôi có thể làm điều đó? nhìn vào lắp ráp trực tiếp và thấy sự khác biệt? hạn chế là trong c99, tôi nghĩ __restrict là C + +? – Anycorn

Trả lời

19

Như đã lưu ý trong các nhận xét, nhiều trình biên dịch C++ mới hơn hỗ trợ việc triển khai C99 của vòng loại hạn chế. Vì restrict không phải là từ khóa dành riêng trong C++, các trình biên dịch thường sử dụng __restrict hoặc __restrict__. Cả hai tài liệu GCCVisual C++ này đều độc đáo, có tham chiếu rõ ràng tới C99.

C++ 1998 tiêu chuẩn quốc gia rằng "typedef specifier sẽ không ... được kết hợp trong một decl-specifier-seq với bất kỳ loại specifier trừ một type-specifier." Về cơ bản, danh sách phải là danh sách các loại thông số , bao gồm hai mã định danh cv, constvolatile.

C99 định nghĩa typedef tương tự, ngoại trừ danh sách các loại vòng loại của nó bao gồm restrict.

Có vẻ như hợp lý để dự đoán hỗ trợ tương tự trong typedefs cho các tiêu chuẩn __restrict ... nhưng bạn không bao giờ biết!

Một cách thông minh và dễ dàng để kiểm tra điều này là như sau:

extern void link_fail(); 

typedef int *__restrict restricted_int_p; 

void test(restricted_int_p a, restricted_int_p b) { 
    *a = 1; 
    *b = 2; 

    if (*a == 2) link_fail(); 
} 

này chỉ đơn giản là khai thác thực tế là nếu biểu tượng chưa được giải quyết link_fail được tìm thấy trong các tập tin đối tượng, các mối liên kết sẽ ném ra một lỗi. Nếu trình biên dịch giới hạn đúng hai đối số, thì nó sẽ biết giá trị của a, ngay cả sau khi b bị thay đổi. Do đó, nó sẽ loại bỏ toàn bộ nếu khối từ tệp đối tượng được tạo vì nó sẽ không bao giờ được chạy.

Lưu ý rằng mặc dù GCC đã hỗ trợ cú pháp giới hạn từ ít nhất là phiên bản 3.0, nhưng nó thực sự không thực hiện tối ưu hóa thích hợp cho đến version 4.5.

+0

"C99 định nghĩa typedef tương tự, ngoại trừ danh sách các loại vòng loại của nó bao gồm các giới hạn". Tôi đã thực hiện [một câu hỏi về điều này] (http://stackoverflow.com/q/43631062/2542702) và tất cả mọi người (đã nhận xét cho đến nay) nghĩ rằng đó là một ý tưởng tồi. Bạn có thể bình luận không? Có hợp pháp C để typedef một con trỏ với hạn chế? –

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