Ai đó có thể vui lòng làm rõ liệu (và tại sao) một chức năng có thể được quy cho pure
hoặc const
nếu nó có tham số con trỏ.GCC tinh khiết/const chức năng chấp nhận một đối số con trỏ
Theo GCC documentation:
Một số ví dụ phổ biến của các chức năng thuần túy là strlen hoặc memcmp.
Toàn bộ điểm của hàm thuần túy là chỉ cần được gọi một lần cho cùng một tham số, tức là kết quả có thể được lưu trong bộ nhớ cache nếu trình biên dịch cho rằng nó phù hợp để làm như vậy, tuy nhiên cách này hoạt động với memcmp?
ví dụ:
char *x = calloc(1, 8);
char *y = calloc(1, 8);
if (memcmp(x, y, 8) > 0)
printf("x > y\n");
x[1] = 'a';
if (memcmp(x, y, 8) > 0)
printf("x > y\n");
Các thông số cuộc gọi thứ hai để memcmp là giống hệt nhau để là người đầu tiên (các con trỏ trỏ đến cùng một địa chỉ), làm thế nào để trình biên dịch biết không sử dụng kết quả từ đầu tiên gọi, nếu memcmp
là tinh khiết?
Trong trường hợp của tôi, tôi muốn chuyển mảng tới hàm thuần túy và tính kết quả dựa trên mảng. Ai đó trấn an tôi rằng điều này là ổn, và khi giá trị trong mảng thay đổi nhưng địa chỉ thì không, hàm của tôi sẽ được gọi chính xác.
Cảm ơn bạn đã liên kết bài viết, thú vị. Nhưng câu hỏi của tôi là cụ thể về các đối số con trỏ tới các hàm thuần túy. – jsj
@ trideceth12 phân tích tương tự cũng áp dụng cho con trỏ. –
Vậy điều gì xảy ra nếu 8 và 1 không được biết tại thời gian biên dịch? Ví dụ. chúng biến đổi? – Kata