2017-01-28 15 views
7

Tôi đang làm việc thông qua tài liệu Mở rộng C của Python để xác định các loại mới và vừa hoàn thành phần Providing finer control over data attributes.Có lợi ích gì khi sử dụng Py_DECREF thay cho Py_XDECREF cho phần mở rộng của Python C không?

Trong phần này, họ thay đổi mã ví dụ để đảm bảo rằng các firstlast thuộc tính của Noddy struct bao giờ có thể NULL, ví dụ bằng cách khởi tạo các thuộc tính thành các chuỗi sản phẩm nào trong new và thêm getter và setter mà nâng TypeError nếu người dùng cố gắng xóa hoặc đặt các thuộc tính này thành Null.

Thêm vào đó (và điểm của câu hỏi của tôi), tác giả thay đổi tất cả các Py_XDECREF-Py_DECREF cho những thuộc tính này, nói rằng:

Với những thay đổi này, chúng tôi có thể đảm bảo rằng các thành viên đầu tiên và cuối cùng là không bao giờ NULL vì vậy chúng tôi có thể loại bỏ các kiểm tra cho các giá trị NULL trong hầu như tất cả các trường hợp. Điều này có nghĩa rằng hầu hết các cuộc gọi Py_XDECREF() có thể được chuyển đổi sang các cuộc gọi Py_DECREF(). Nơi duy nhất chúng tôi không thể thay đổi các cuộc gọi này là trong deallocator, nơi có khả năng khởi tạo của các thành viên này thất bại trong constructor.

Dường như với tôi rằng nó sẽ chỉ được an toàn hơn để sử dụng Py_XDECREF, cho rằng Py_DECREF kết quả trong một segmentation fault nếu nó thông qua một giá trị NULL.

Lợi ích khi sử dụng Py_DECREF qua Py_XDECREF là gì?

Trả lời

5

Nếu bạn biết rằng đối tượng không thể NULL, những lợi ích của Py_DECREF qua Py_XDECREF là rằng:

  • nó là nhanh hơn, vì nó tránh được một thử nghiệm và nhảy không cần thiết;
  • Ngoài ra, nó cung cấp những gì có hiệu quả là một xác nhận không chi phí mà con trỏ là không NULL - chương trình sẽ ngay lập tức sụp đổ nếu bất biến bị hỏng.

Cả hai điểm có thể quan trọng khi giao dịch với mã cấp thấp, đó là lý do Python lõi và hầu hết các phần mở rộng là cẩn thận để chỉ sử dụng Py_XDECREF (hoặc Py_CLEAR) khi con trỏ thực sự có thể là NULL.

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