2009-02-11 30 views
7

Trong C, tôi có thể phân bổ một thanh ghi cho một biến, ví dụ:Java tương đương với đăng ký int?

register int i = 0; 

Tôi biết rằng Java là một ngôn ngữ giải thích, và nhiều nhiều trừu tượng xa CPU.

Có bất kỳ cơ chế nào có sẵn để yêu cầu (và nếu kiến ​​trúc không cho phép nó), thì biến của tôi vẫn còn trong sổ đăng ký thay vì chuyển sang bộ nhớ cache hoặc bộ nhớ chính?

Tôi không cho rằng có bất kỳ cách nào, nhưng trước đây tôi đã rất ngạc nhiên.

Cảm ơn bạn,

+1

"đăng ký" trong C hoàn toàn vô dụng và đã tồn tại ít nhất một thập kỷ. Trình tối ưu hóa không cần gợi ý. –

+0

"ngôn ngữ diễn giải". Thông dịch viên là tài sản của hệ thống ngôn ngữ, không phải ngôn ngữ. Hầu hết (đối với một số định nghĩa phù hợp) Java được thực hiện được biên dịch. –

Trả lời

3

Không, không có cách nào để yêu cầu điều này trong Java. Tuy nhiên, có một số điều bạn có thể làm sẽ ngăn không cho đăng ký được sử dụng, chẳng hạn như áp dụng công cụ sửa đổi volatile cho biến thành viên.

+0

đăng ký sẽ chỉ áp dụng cho một biến địa phương (hoặc tham số). Biến động của Java cũng không áp dụng cho cả hai. IIRC, những gì thực sự đăng ký nó ngăn chặn một tham chiếu được đưa đến một biến, mà Java không làm anyway. –

+0

Hotspot có bao giờ lưu trữ giá trị của biến thành viên trong sổ đăng ký không? Tôi nghĩ rằng 'biến động' là cần thiết, một phần, để đảm bảo rằng những thay đổi đối với giá trị (bản sao của a) trong sổ đăng ký đã được đẩy ra khỏi bộ nhớ chính. – erickson

+1

dễ bay hơi chỉ đảm bảo rằng tất cả các chuỗi sẽ thấy phiên bản mới nhất. Không có gì đảm bảo rằng nó sẽ không được tải vào một thanh ghi. Khả năng hiển thị luồng đó hoàn toàn trái với JVM. –

18

register trong C không đặt biến để đăng ký. Nó chỉ đơn giản là cung cấp cho trình biên dịch gợi ý, rằng nó có lẽ sẽ là tốt để đặt nó vào một đăng ký.

Trong Java không có tương đương.

6

Nếu nó được sử dụng đủ trong một không gian ngắn mà làm cho nó một đăng ký int sẽ là đáng giá, sau đó trình biên dịch hotspot sẽ có thể con số đó ra chính nó.

Thực tế, trình biên dịch điểm phát sóng có thể thực hiện công việc tốt hơn trình biên dịch C/C++, vì nó có nhiều thông tin hơn để làm việc. Trình biên dịch C/C++ phải đoán; HotSpot có thể đo lường.

5

Không tương đương với Java. Ngay cả trong C không có đảm bảo rằng biến sẽ được lưu trữ trong một thanh ghi và trình biên dịch được tự do bỏ qua nó.

Trong Java, phương thức này sẽ được diễn giải cho đến khi điểm phát sóng JIT xác định rằng nó cần được biên dịch. Đối với mã được biên dịch, nó sử dụng một thuật toán tô màu để gán các biến và các giá trị tạm thời cho các thanh ghi, hoặc ghi vào/ra khỏi RAM trong trường hợp tràn đăng ký.

3

Tôi biết rằng Java là ngôn ngữ được giải thích và rất nhiều trong số các phần tóm tắt cách xa CPU.

Bạn khá nhiều trả lời câu hỏi của riêng bạn có :-)

Nhưng nghiêm túc, nói chung, viết mã của bạn càng rõ ràng và đơn giản là bạn có thể, và JVM sẽ làm những gì có thể để đối xử với mã của bạn đúng.

0

Bạn có thể tạo chú thích có tên @register nhưng JVM chắc chắn sẽ bỏ qua nó. ví dụ:

@register int i = 0; 
Các vấn đề liên quan