2013-01-14 20 views
10

Các tài liệu cho @inline trạng thái:Yêu cầu thêm thông tin về @inline từ trình biên dịch?

Một chú thích về phương pháp nào có yêu cầu rằng trình biên dịch nên cố gắng đặc biệt khó inline phương pháp được chú thích.

Chú thích, trình biên dịch không (theo mặc định) cung cấp bất kỳ thông tin nào về việc có quản lý nội tuyến hay không.

Có cách nào để xác định xem trình biên dịch có quản lý nội tuyến phương thức được chú thích không?

Cụ thể, tôi muốn trình biên dịch cho tôi biết, ví dụ, trong mọi trường hợp hợp lý, nó sẽ có thể nội tuyến một phương pháp tôi đã đánh dấu. (Một số situtations tôi có thể nghĩ về nơi mà nó sẽ cảnh báo với tôi rằng nó không thể inline một phương pháp là nếu nó không phải là final, và do đó đòi hỏi một tra cứu vtable nếu lớp được subclassed)

câu hỏi liên quan:

+0

Tôi đoán biên dịch với '-Yinline-warnings' không phải là những gì bạn đang tìm kiếm? –

+0

Có thể, tại sao bạn không thêm câu trả lời giải thích những gì '-Yinline-warning' làm gì? –

Trả lời

6

Trước tiên, bạn cần phải nhớ rằng Scalac sẽ chỉ cố gắng inline thứ khi bạn biên dịch với -optimise (hoặc -Yinline tôi suy nghĩ).

Hãy xem xét các trường hợp đơn giản sau đây:

class Meep { 
    @inline def f(x: Int) = x + 19 
} 

object Main extends App { 
    new Meep().f(23) 
} 

Nếu tôi biên dịch rằng với -optimise, Scalac sẽ mang lại cho tôi một lời cảnh báo: there were 1 inliner warnings; re-run with -Yinline-warnings for details. Bây giờ, ngoài ngữ pháp cười khúc khích, điều này đã không cho tôi nhiều.

Vì vậy, hãy biên dịch lại với -Yinline-warnings. Bây giờ tôi nhận được: At the end of the day, could not inline @inline-marked method f. Uh, OK, điều đó cũng không hữu ích lắm, nhưng tôi đoán đó là những gì tôi nhận được khi sử dụng cờ trình biên dịch riêng. :) Một số cảnh báo nội tuyến là một chút hữu ích hơn, bằng cách này - như: Could not inline required method f because bytecode unavailable. (xảy ra trong REPL)

Trợ giúp trình biên dịch giải thích -Yinline-warningsEmit inlining warnings. (Normally surpressed due to high volume), vì vậy tôi đoán nó phải được sử dụng trên từng trường hợp cụ thể.

Dù sao, nếu chúng tôi thay đổi định nghĩa f trong đoạn mã trên thành @inline final def f(x: Int) = x + 19, cảnh báo nội tuyến sẽ biến mất và phương pháp sẽ được gạch chân đúng cách.

Hy vọng điều đó sẽ giúp ích một chút.

+0

Hoàn hảo, đây chính xác là những gì tôi đang tìm kiếm. Bạn có xảy ra để biết một tham chiếu đầy đủ cho tất cả các tùy chọn trình biên dịch scala? –

+3

Trong trình bao, bạn có thể lấy thông tin về tất cả các tùy chọn được hỗ trợ với 'scalac -help', các tùy chọn nâng cao với các tùy chọn« scalac -X' và "riêng" với 'scalac -Y'. –

+0

Heh, tôi xấu hổ khi nói rằng tôi không biết điều đó. Tôi cho rằng đó là những gì tôi nhận được chủ yếu bằng cách sử dụng một IDE cho tất cả các nhiệm vụ scala của tôi, bao gồm cả biên dịch. –