2010-07-10 49 views
25

Có bất kỳ chi phí nào liên quan đến việc sử dụng biểu thức lambda trong C++ 0x (trong VS2010) không?
Tôi biết rằng việc sử dụng hàm chức năng phải chịu phí, nhưng tôi đang đề cập đến các biểu thức được chuyển tới các thuật toán STL chẳng hạn. Trình biên dịch có tối ưu hóa biểu thức, loại bỏ những gì dường như xuất hiện như một cuộc gọi hàm? Tôi bắt đầu thực sự thích những biểu thức lambda, nhưng tôi hơi lo ngại về hình phạt tốc độ.C++ 0x Lambda overhead

Cảm ơn trước!

+7

Tại sao bạn chắc chắn rằng việc sử dụng các đối tượng hàm (functors) phát sinh chi phí? Chúng cũng có thể được tối ưu hóa! Cách duy nhất để biết là xây dựng với tối ưu hóa đầy đủ được kích hoạt và sau đó nhìn vào hội đồng. – EFraim

+0

Khi tôi nói đối tượng chức năng tôi đã đề cập đến một cái gì đó như tăng :: chức năng, lỗi của tôi. Tôi biết rằng các đối tượng chức năng cổ điển có thể được inlined, và tôi muốn biết nếu điều này xảy ra với lambdas quá. –

+0

ah ok, những người có một số chi phí. Nhưng Lambdas không (trừ khi bạn bọc chúng trong một đối tượng 'std :: function' (không cần sử dụng boost, vì nó đã được chấp nhận vào tiêu chuẩn 0x – jalf

Trả lời

43

Bạn "biết" các đối tượng chức năng đó có phải trả phí không? Có lẽ bạn nên kiểm tra lại sự thật của mình. :)

Thường có chi phí bằng không để sử dụng thuật toán STL với đối tượng hàm, so với vòng lặp được cuộn bằng tay. Một trình biên dịch ngây thơ sẽ phải liên tục gọi operator() trên functor, nhưng đó là tầm thường để nội tuyến và do đó có hiệu lực, chi phí là số không.

Biểu thức lambda không gì khác ngoài đường cú pháp cho đối tượng hàm. Mã được chuyển thành một đối tượng hàm bởi trình biên dịch, vì vậy nó cũng có tổng chi phí bằng không.

+4

Theo kinh nghiệm, điều này là sai. Thêm rất nhiều instantiation của 'std :: functions' làm tăng đáng kể kích thước của file thực thi, ít nhất là trong VS2010. Tôi vừa thực hiện bài kiểm tra này. – shoosh

+8

@shoosh: Vậy? Thêm rất nhiều instantiation của 'std: string' cũng phải chịu rất nhiều chi phí. Nhưng đó không phải là câu hỏi, hay câu trả lời của tôi, là về. Họ là về các đối tượng chức năng và lambdas. 'std :: function' không phải là. – jalf

+8

chỉ để xây dựng, 'std :: function' là một lớp bao bọc, trừu tượng hóa trên tất cả các đối tượng có thể gọi, cho dù con trỏ hàm hay hàm functors. Và nó không phải là miễn phí để sử dụng. Nhưng nếu bạn tránh các wrapper, và chỉ cần sử dụng một functor, hoặc một lambda, trực tiếp, có số không trên không – jalf

18

Dưới mui xe,

void f(char delim) 
{ 
    std::for_each(seq.begin() 
       , seq.end() 
       , [=](const T& obj){std::cout << obj << delim;}); 
} 

khoảng chuyển thành

class __local_class_name { 
    char __delim; 
public: 
    __local_class_name(char delim) : __delim(delim) {} 
    void operator()(const T& obj) {std::cout << obj << __delim;} 
}; 

void f(char delim) 
{ 
    std::for_each(seq.begin() 
       , seq.end() 
       , __local_class_name(delim)); 
} 

Như với tất cả các đối tượng chức năng, trên cao là rất tối thiểu, kể từ khi các cuộc gọi có thể dễ dàng được inlined.

+2

Hãy nhớ rằng' delim' phải được capture một cách rõ ràng. – Dario

+4

Anh ta làm, '[=]' chỉ ra rằng tất cả các đối tượng địa phương phải được ghi lại theo giá trị –

+1

@ Dennis: Chỉ jalf thêm '=', vì vậy @Dario đã đúng. ': (' @ Jalf: Cảm ơn. rằng tôi đã không có thời gian để chơi với điều này, do đó, tất cả đều gõ từ tin đồn – sbi

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