2011-11-28 28 views
7

Dưới đây là một số mã tôi đã viết (sử dụng __restrict__ phần mở rộng của GCC C++):Cách * hạn chế/* __ restrict__ hoạt động trong C/C++?

#include <iostream> 

using namespace std; 

int main(void) { 
    int i = 7; 
    int *__restrict__ a = &i; 
    *a = 5; 
    int *b = &i, *c = &i; 
    *b = 8; 
    *c = 9; 

    cout << **&a << endl; // *a - which prints 9 in this case 

    return 0; 
} 

Hoặc, phiên bản C (trong trường hợp phiên bản C++ là không rõ ràng do việc sử dụng một phần mở rộng mà mỗi phổ biến C++ hỗ trợ), sử dụng GCC:

#include <stdio.h> 

int main(void) { 
    int i = 7; 
    int *restrict a = &i; 
    *a = 5; 
    int *b = &i, *c = &i; 
    *b = 8; 
    *c = 9; 

    printf("%d \n", **&a); // *a - which prints 9 in this case 

    return 0; 
} 

Từ những gì tôi đã đọc, nếu tôi làm *a = 5, nó thay đổi giá trị của bộ nhớ ông, a, trỏ đến; sau đó, bộ nhớ mà người đó đang trỏ đến không được sửa đổi bởi bất kỳ ai khác ngoại trừ a, điều đó có nghĩa là các chương trình này sai vì bc sửa đổi nó sau đó. Hoặc, ngay cả khi b sửa đổi i trước tiên, sau đó chỉ a sẽ có quyền truy cập vào bộ nhớ đó (i). Tôi có nhận được chính xác không?

P.S: Hạn chế trong chương trình này không thay đổi bất cứ điều gì. Có hoặc không có giới hạn, trình biên dịch sẽ tạo ra cùng một mã assembly. Tôi đã viết chương trình này chỉ để làm rõ mọi thứ, nó không phải là một ví dụ tốt của việc sử dụng restrict. Một ví dụ tốt về restrict sử dụng bạn có thể xem tại đây: http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html

+5

Không có 'giới hạn' trong C++; bất cứ điều gì khác là một phần mở rộng trình biên dịch. –

+1

có thể trùng lặp của [Con người có thể tạo ra từ vòng loại hạn chế nào?] (Http://stackoverflow.com/questions/1506794/what-can-human-beings-make-out-of-the-restrict-qualifier) –

+0

@KerrekSB Xem xét chương trình này trong C, sử dụng "hạn chế", tôi đã hỏi C/C++ ... Một trong số đó. –

Trả lời

11

số

Báo cáo

*b = 8; 
*c = 9; 

sẽ gây ra hành vi không xác định.

Từ tài liệu:

Một con trỏ là địa chỉ của một vị trí trong bộ nhớ. Nhiều hơn một con trỏ có thể truy cập cùng một đoạn bộ nhớ và sửa đổi nó trong suốt quá trình của một chương trình. Loại vòng loại loại restrict là chỉ thị cho trình biên dịch, nếu bộ nhớ được chỉ định bởi con trỏ được đánh dấu restrict được sửa đổi, không có con trỏ nào khác truy cập cùng bộ nhớ đó. Trình biên dịch có thể chọn tối ưu hóa mã liên quan đến restrict con trỏ được chứng nhận theo cách có thể dẫn đến hành vi không chính xác. Đó là trách nhiệm của lập trình viên để đảm bảo rằng các con trỏ được đánh giá là restrict được sử dụng như chúng được dự định sẽ được sử dụng. Nếu không, hành vi không xác định có thể xảy ra.

+0

Tôi có viết cùng một thứ không? Tôi đã không hỏi nếu chương trình là chính xác, tôi nói bản thân mình rằng nó là sai vì b và c. Bởi sai tôi không có nghĩa là nó sẽ đưa ra một lỗi, thậm chí không phải là một thông điệp cảnh báo vì nó là một "Hợp đồng giữa lập trình viên và trình biên dịch", trình biên dịch không kiểm tra nó. Vì vậy, tôi hiểu rằng câu trả lời cho câu hỏi của tôi ("Tôi nhận được nó một cách chính xác/phải không?") Là một "Không" đơn giản? –

+0

Trong trường hợp câu hỏi không rõ ràng: Tôi đã không hỏi nếu chương trình là chính xác, nó đã được dự định là sai. Tôi hỏi nếu giải thích về sự hiểu biết của tôi về "hạn chế" theo mã là chính xác. –

+3

@MoraruLilian "Không" là câu trả lời đặc biệt cho "Hoặc, ngay cả khi" b "sửa đổi" i "đầu tiên, sau đó chỉ" a "nên có quyền truy cập vào bộ nhớ đó (" i "). Tôi có nhận được đúng không?" Vấn đề là bạn thậm chí không được phép truy cập biến này bằng một con trỏ khác. – Beginner

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