2010-08-08 30 views
10

Tôi đang thử nghiệm với gcov sử dụng mingw gcc 4.4.0. Tôi đã nhận được một số kết quả thú vị nhưng lạ. Một mô hình phổ biến là một cái gì đó như thế này ...Làm cách nào để có được kết quả chính xác hơn từ gcov?

 5162: 66: std::string::iterator i = l_Temp.begin(); 
    5162: 67: std::string::iterator j = l_Temp.end() - 1; 
     -: 68: char ch; 
     -: 69: 
    20564: 70: while (i < j) 
     -: 71: { 
    10240: 72: ch = *i; *i = *j; *j = ch; i++; j--; 
     -: 73: } 
     -: 74: 
    #####: 75: return l_Temp; 
     -: 76:} 

Làm thế nào có thể rằng return không được exected ở tất cả, cho rằng các vòng lặp ngay trước khi rõ ràng là cả hai thực hiện và thoát? Tôi nghĩ rằng tôi là nạn nhân của tối ưu hóa giá trị trả lại ở đây, cho rằng biến tạm thời này thuộc loại std::string.

Vấn đề là, tôi đã chỉ định -O0 trong tùy chọn trình biên dịch. Đây là những cờ trình biên dịch chính xác mà tôi đang sử dụng ...

-Wno-invalid-offsetof -g -O0 -fprofile-arcs -ftest-coverage 

Tôi đoán tốt nhất là không phải tất cả các tối ưu hóa đều bị vô hiệu hóa bởi -O0 sau tất cả. Tôi có thể bắt đầu tìm kiếm các cờ tối ưu hóa cụ thể từng người một khi tôi nhận thấy vấn đề, nhưng điều này có vẻ là một điều kỳ lạ cần phải làm.

Vì vậy - những gì cờ nên Tôi đang xác định để có được kết quả bảo hiểm lành mạnh từ gcov?

EDIT

Cho đến nay, tôi nghĩ rằng tôi cần những lá cờ bổ sung sau đây ...

  • -fno-mặc-inline
  • -fno-inline

Tôi không chắc rằng đây là cả hai cần thiết, mặc dù tôi nghĩ rằng họ từng vô hiệu hóa một loại cụ thể khác nhau của nội tuyến.

Tôi chưa tìm thấy cách nào để vô hiệu hóa tối ưu hóa giá trị trả lại. Đây không phải là một vấn đề lớn, nhưng nó hơi khó chịu. Khi nhắm tới mức độ phù hợp 100%, một số tệp thực sự đạt được 100% sẽ được báo cáo là ít hơn do vấn đề này. Một grep có thể tìm thấy các dấu hiệu ##### và hiển thị nếu chúng cho các câu hỏi return, nhưng bạn vẫn cần thực hiện một số kiểm tra trực quan để kiểm tra xem vấn đề có hoàn toàn là RVO hay không.

+2

Việc thêm các nhà thầu xây dựng không giúp gì được? – Mat

+0

@Mat - Tôi sẽ kiểm tra, nhưng hôm nay tôi đang bận – Steve314

+0

Có thể chức năng của bạn được inlined. Thử biên dịch bằng -O0. – whoplisp

Trả lời

3

Như được đề xuất trong nhận xét của Mat, tùy chọn -fno-elide-constructors khắc phục sự cố này.

Câu trả lời này đã được đăng để nhận câu hỏi đã được cổ này đóng lại. Nếu Mat đăng câu trả lời, tôi sẽ xóa câu trả lời này và chuyển chấp nhận cho câu trả lời đó.

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