Tôi đang phát triển trò chơi sử dụng XNA và C# và cố gắng tránh gọi new struct()
nhập mã mỗi khung hình như tôi nghĩ rằng nó sẽ làm hỏng GC. "Nhưng chờ đã," tôi tự nhủ, "struct là một loại giá trị. GC không nên gọi như vậy, phải không?" Vâng, đó là lý do tại sao tôi hỏi ở đây.Điều gì xảy ra khi các loại giá trị được tạo?
Tôi chỉ có một ý tưởng rất mơ hồ về những gì xảy ra với các loại giá trị. Nếu tôi tạo một cấu trúc mới trong một cuộc gọi hàm, cấu trúc có được tạo trên ngăn xếp không? Nó sẽ chỉ đơn giản được đẩy và popped và hiệu suất không có một hit? Hơn nữa, sẽ có một số giới hạn bộ nhớ hoặc hiệu suất hoạt động nếu, nói rằng, tôi cần phải tạo ra nhiều trường hợp trong một cuộc gọi duy nhất?
Lấy ví dụ, mã này:
spriteBatch.Draw(tex, new Rectangle(x, y, width, height), Color.White);
Rectangle trong trường hợp này là một struct. Điều gì xảy ra khi Hình chữ nhật mới đó được tạo? Các hàm ý của việc phải lặp lại dòng đó nhiều lần như thế nào (nói, hàng ngàn lần)? Hình chữ nhật này có được tạo ra, một bản sao được gửi đến phương thức Draw, và sau đó bị loại bỏ (nghĩa là không có bộ nhớ nào được ăn nhiều hơn Draw được gọi theo cách đó trong cùng một chức năng)?
P.S. Tôi biết điều này có thể là tối ưu hóa trước khi trưởng thành, nhưng tôi hầu như tò mò và muốn hiểu rõ hơn về những gì đang xảy ra.
Nếu tôi gọi cùng một chức năng hơn và hơn, là một hình chữ nhật mới đẩy mỗi cuộc gọi đến Vẽ, và xuất hiện khi Draw trả về? – Bob
Có, nhưng lưu ý rằng đẩy và popping stack khung chỉ là incrementing/decrementing một con trỏ (một hướng dẫn máy đơn). Và trình biên dịch JIT sẽ tối ưu hóa mọi thứ cho vương quốc. – thecoop
@Bob: Vâng, mặc dù tôi đoán nó có thể - theo lý thuyết - rằng JIT * có thể * nhìn thấy các cuộc gọi giống hệt nhau và bộ nhớ cache giá trị để gửi nhiều lần, nhưng điều này dường như rất khó đưa ra các chẩn đoán có liên quan đến việc phát hiện điều này và có thể dễ dàng bị loại trừ. –