2016-12-31 22 views
12

Chúng tôi đang sử dụng đệ quy để tìm các yếu tố và đang nhận ngoại lệ StackOverflow. Chúng tôi đã đọc rằng the C# compiler on x64 computers performs tail call optimizations:Tại sao tối ưu hóa cuộc gọi đuôi không xảy ra ở đây?

JIT chắc chắn thực hiện tailcals khi chạy mã được tối ưu hóa và không gỡ lỗi.

Chạy dotnet --configuration release bị này đến nay trong chương trình của chúng tôi:

...      
7214 is a factor of 1234567890 
7606 is a factor of 1234567890 
10821 is a factor of 1234567890 
11409 is a factor of 1234567890     

Process is terminated due to StackOverflowException. 

Tại sao tối ưu hóa cuộc gọi đuôi không xảy ra?

class Program 
{ 
    static void Main(string[] args) 
    { 
     const long firstCandidate = 1; 
     WriteAllFactors(1234567890, firstCandidate); 
    } 

    private static void WriteAllFactors(long number, long candidate) 
    { 
     if (number % candidate == 0) 
     { 
      System.Console.WriteLine($"{candidate} is a factor of {number}"); 
     } 

     candidate = candidate + 1; 
     if(candidate > number/2) 
     { 
      return; 
     } 

     WriteAllFactors(number, candidate); 
    } 
} 
+1

Không gọi đệ quy đuôi yêu cầu bạn trả lại giá trị? – zzzzBov

+0

@zzzzBov Tôi đoán đó là một câu hỏi tu từ. :) –

+1

Không có sự trở lại nào cả; điều gì khiến điều này ngừng chạy mãi mãi? –

Trả lời

3

VSadov cung cấp lý do rõ ràng cho điều này trong câu trả lời của mình:

chung JIT phát ra đuôi gọi khi nó tìm thấy rằng lợi nhuận.

Bên cạnh đó, ông tiếp tục nói rõ:

Đây là một phần không thể diễn tả được bằng C#. Không giống như nội tuyến, trong đó có thể bị ép buộc thông qua các thuộc tính, không thể buộc hiện tượng tailcalling. Nếu cần viết mã như EmitMethodCall phát ra, anh ta không thể sử dụng C#.

Vì vậy, câu trả lời là mặc dù các ổ khóa chắc chắn có sẵn và được sử dụng, không có cách nào để dự đoán khi nào chúng sẽ được sử dụng hoặc buộc chúng được sử dụng trong C#.

+0

Tôi cảm thấy ngạc nhiên rằng nó không phải là lợi nhuận để ngăn chặn một ngoại lệ StackOverflow. Nếu đó là câu trả lời, thì đó là câu trả lời. –

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