Trong khi chơi với VS11 beta tôi nhận thấy một cái gì đó kỳ lạ: mã này coutsTrình biên dịch có thể sắp xếp lại mã qua các lệnh gọi tới std :: chrono :: system_clock :: now()?
f mất 0 mili giây
int main()
{
std::vector<int> v;
size_t length =64*1024*1024;
for (int i = 0; i < length; i++)
{
v.push_back(rand());
}
uint64_t sum=0;
auto t1 = std::chrono::system_clock::now();
for (size_t i=0;i<v.size();++i)
sum+=v[i];
//std::cout << sum << std::endl;
auto t2 = std::chrono::system_clock::now();
std::cout << "f() took "
<< std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
<< " milliseconds\n";
}
Nhưng khi tôi quyết định bỏ ghi chú dòng với couting số tiền sau đó nó in ra một số hợp lý.
Đây là hành vi của tôi nhận được với tối ưu hóa kích hoạt, với họ tàn tật tôi nhận được "bình thường" cout
f() mất 471 mili giây
Vì vậy, là hành vi tuân thủ tiêu chuẩn này? Quan trọng: nó không phải là mã chết được tối ưu hóa đi, tôi có thể thấy sự chậm trễ khi chạy từ giao diện điều khiển, và tôi có thể thấy CPU tăng đột biến trong Task Manager.
Đã kiểm tra, bạn nói đúng, nhưng bây giờ tôi đã nhầm lẫn, nếu thông minh để hiểu rằng tổng hợp không được sử dụng tại sao nó thực hiện khởi tạo? Tôi đoán nó không thể chứng minh rằng rand() không có tác dụng phụ ... – NoSenseEtAl
ouch ... ofc nó không thể chứng minh rằng rand không có tác dụng phụ-rand isnt một chức năng tinh khiết ... nó có nhà nước. :) nhưng thậm chí thay thế rand() với tôi vẫn không ngăn chặn khởi tạo ... – NoSenseEtAl
@NoSenseEtAl: Vâng khởi tạo không hoạt động bằng cách sử dụng 'push_back' ... do đó, tôi đoán là mặc dù trình biên dịch có thể có thể nói rằng' v 'chỉ được sử dụng sau này theo những cách nó có thể loại bỏ, nó không phải là hạnh phúc để giả định rằng' push_back() 'sẽ không có tác dụng phụ khác. Tôi không muốn nói chắc chắn. –