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 GCC và Visual 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, const
và volatile
.
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.
Nguồn
2010-05-01 08:08:45
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
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
@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