Tôi giả sử bạn đang sử dụng GCC khi biên dịch, tôi đã thử trên 4.8.4. Bí quyết ở đây là GCC hiểu ngữ nghĩa của các chức năng thư viện chuẩn nào đó (strcmp
là một trong số chúng). Trong trường hợp của bạn, trình biên dịch sẽ loại bỏ hoàn toàn cuộc gọi thứ hai strcmp
, vì nó biết rằng kết quả của strcmp
hằng số chuỗi đã cho "0"
và "9"
sẽ là âm và giá trị tương thích chuẩn (-1) sẽ được sử dụng thay vì thực hiện cuộc gọi. Nó không thể thực hiện tương tự với cuộc gọi đầu tiên, bởi vì s1
và s2
có thể đã bị thay đổi trong bộ nhớ (hãy tưởng tượng một ngắt hoặc nhiều luồng, v.v.).
Bạn có thể thực hiện thử nghiệm để xác thực điều này. Thêm const
vòng loại để các mảng để cho GCC biết rằng họ không thể thay đổi:
const char s1[] = "0";
const char s2[] = "9";
printf("%d\n", strcmp(s1, s2)); // Now this will print -1 as well
printf("%d\n", strcmp("0", "9")); // Prints -1
Bạn cũng có thể nhìn vào sản lượng lắp ráp thành các trình biên dịch (sử dụng -S
cờ).
Cách tốt nhất để kiểm tra là sử dụng -fno-builtin
, điều này sẽ vô hiệu hóa tối ưu hóa này. Với tùy chọn này, mã ban đầu của bạn sẽ in -9 trong cả hai trường hợp
Nguồn
2015-10-12 22:58:35
http://ideone.com/S3dYMQ nếu có ai muốn chơi ... –