Shallow và deep copy: độc lập ở tầng nào của transaction?
Tiên quyết
Sau bài này bạn sẽ
- Phân biệt assignment handle, shallow copy và copy có ownership riêng
- Kiểm identity của cả object ngoài và object con
- Ghi rõ giới hạn của clone đối với null và đồ thị object
Snapshot cần giữ dữ liệu dù producer sửa tiếp
Scoreboard giữ expected rồi producer đổi transaction để dùng lại. Một bản copy chỉ độc lập ở object ngoài vẫn có thể chứa handle tới payload producer đang sửa. Cần xác định tầng nào phải độc lập, thay vì chỉ hỏi đã gọi new hay chưa.
Gán handle không tạo transaction thứ hai
B5.class-handle đã kiểm việc hai handle trỏ cùng object. Khi cần snapshot, assignment không đủ. Trong bài này, Frame có id kiểu int và payload kiểu handle tới Payload; hai member có cách chia sẻ khác nhau khi copy.
New source tạo object ngoài mới, giữ nested handle
shallow = new original là cú pháp shallow copy được kiểm trong ví dụ. Shallow khác identity với original, id được copy, nhưng hai payload handle vẫn trỏ cùng object. Source còn có static constructed để kiểm constructor không chạy lại cho shallow copy trên flow này.
Clone tự viết phải quyết định ownership của từng member
Method clone tạo Frame mới, copy id rồi tạo Payload mới với value cũ nếu payload nguồn khác null. Main kiểm cả Frame identity và Payload identity trước khi sửa dữ liệu. Không có phép copy chung tự hiểu mọi policy của transaction trong dự án.
Sửa nguồn sau copy để phân biệt hai đường
Ban đầu original có id 1 và payload 7. Sau copy, nguồn đổi id 9/payload 30. Shallow giữ id 1 nhưng thấy payload 30; deep giữ id 1/payload 7. Chỉ so ba object ngay sau copy chưa đủ, vì chúng đều có cùng dữ liệu tại thời điểm ấy.
Clone phải có hợp đồng cho nested null
Main tạo thêm Frame rồi đặt payload=null; clone của nó phải là Frame khác có payload=null. Code không dereference null hoặc tự tạo payload mặc định 7 để che trạng thái absent. Tổng constructor 4 gồm original, deep, empty và empty_copy; shallow không thêm một lần.
Một cấp clone chưa giải quyết mọi đồ thị object
Example chỉ có một nested Payload không chứa handle khác. Nếu có cycle, shared child giữa nhiều field, derived type hoặc external resource, cần policy riêng để giữ đúng identity và tránh recursion vô hạn. Không gọi method này là deep clone tổng quát cho mọi transaction.
Kiểm cả identity và dữ liệu sau mutation
Expected trước chạy: outer identity khác; nested shallow thấy 30; deep giữ 7; shallow id 1/original id 9; null được giữ; constructed 4. Mutation thay allocation payload bằng gán handle bị bắt với symptom deep clone must own nested storage.
Tự kiểm tra
Review copy theo sơ đồ ownership
Vẽ object ngoài và từng handle con. Với mỗi đường tham chiếu, quyết định share hay copy, null có nghĩa gì và ai có thể sửa sau khi gửi. Test phải sửa nguồn sau copy và kiểm cả identity; một hàm tên clone không tự bảo đảm snapshot độc lập.
Nguồn và mức độ đối chiếu
- Copying Techniques in SV — bản chụp resources.zip, Nguồn đào tạo đã đọc. Trích dẫn; nguồn đã đọc các mục liên quan.
- Thí nghiệm nguyên bản ex.b5.copy, Bằng chứng thực nghiệm. Trích dẫn; nguồn đã đọc toàn văn.
- IEEE 1800-2023 SystemVerilog LRM, Class handles, inheritance, virtual methods, access and parameterization. Chưa đối chiếu với văn bản nguồn (chưa mở).
- Thí nghiệm nguyên bản ex.b5.copy, Source, self-checks, verification.json và mutation/capability probes. Trích dẫn; nguồn đã đọc toàn văn.
- Copying Techniques in SV — bản chụp resources.zip, Shallow copy in SystemVerilog; Example for shallow copy. Trích dẫn; nguồn đã đọc các mục liên quan.
- Deep copy in SystemVerilog — bản chụp resources.zip, Deep copy Example; Highlights. Trích dẫn; nguồn đã đọc các mục liên quan.