2015-12-18 18 views
5

Hãy xem xét một lớp học như:Các trình biên dịch có tránh quảng cáo tích phân trung gian hoặc chuyển đổi không?

struct mystruct 
{ 
    constexpr operator char() {return x;} 
    signed char x; 
}; 

và phẫu thuật như:

mystruct m; 
m.x = /* something at runtime */ 
int i = 3 * m + 45ULL * m; 

Are trình biên dịch có thể bỏ qua việc chuyển đổi tạm thời để char và chuyển đổi trực tiếp m để loại yêu cầu trong biểu thức 3 * m + 45ULL * m?

+3

Biên dịch để lắp ráp và tìm hiểu! – user657267

+0

Điều đó tùy thuộc vào trình biên dịch và cờ bạn đã sử dụng. Nhưng sau đó nếu bạn 'trở lại x thì sao? x * 10: 10; 'hoặc một cái gì đó phức tạp hơn. Tôi không nghĩ rằng trình biên dịch nói chung bỏ qua * trung gian * chuyển đổi sang 'char' bởi vì sau tất cả, nó có thể thực hiện rất nhiều thứ phức tạp và vì vậy giá trị cuối cùng có thể không được tính * mà không biết * giá trị trung gian, cũng bao gồm những thứ như cắt ngắn do loại nhỏ hơn. – Nawaz

+1

Trình biên dịch thực hiện các quy tắc ngôn ngữ, tốt nhất có thể. Nếu kết quả không khớp với những gì bạn sẽ suy ra bằng cách áp dụng các quy tắc, trình biên dịch bị hỏng. –

Trả lời

0

Có vẻ như GCC phiên bản 5.3.0 có thể tối ưu hóa chức năng gọi hàm, trong khi Clang 3.7 không thông minh.

Đối với đoạn mã này:

struct mystruct 
{ 
    constexpr operator char() const {return x;} 
    signed char x; 
} m; 

void func(const int num) { 
    m.x = num*2; 
    int i = 3 * m + 45ULL * m; 
} 

bạn có thể kiểm tra hội đồng biên soạn và so sánh chúng:

Clang with cast vs Clang with direct reference to field

Gcc with cast vs Gcc with direct reference to field

Mặc dù trong một tình huống hơi khác nhau Clang thực hiện manage to optimize cuộc gọi đến ca Hàm st.

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