Là một biểu thức hằng số không đổi, trình biên dịch có mọi quyền sử dụng phép gấp liên tục để loại bỏ nó khỏi chương trình. Điều này không đúng nếu bạn lấy địa chỉ của nó. Ngoài ra, một trình biên dịch tối ưu hóa hiện đại có thể sử dụng LTO, nội tuyến và gấp liên tục để làm tương tự với c3 và c4, nếu có thể.
Nếu bạn không lấy địa chỉ của một biến, trình biên dịch không có nghĩa vụ phân bổ nó nếu nó có thể tạo mã với kết quả tương đương, theo quy tắc as-if.
Chỉnh sửa: Gấp liên tục là nơi trình biên dịch đánh giá biểu thức tại thời gian biên dịch thay vì thời gian chạy. Ví dụ: bạn có thể hợp pháp làm int x[3 + 4];
trong đó 3 + 4
được đánh giá tại thời điểm biên dịch. Một số ví dụ, đặc biệt là những người có liên quan đến ICE, là tiêu chuẩn bắt buộc, nhưng việc thực hiện có thể thực hiện nhiều hơn nếu có thể. LTO là Tối ưu hóa thời gian liên kết, là nơi trình biên dịch thực hiện tối ưu hóa trên các đơn vị dịch khi chúng được liên kết với nhau. Điều này có nghĩa là trình biên dịch có thể inline nội dung của my_f
, và sau đó (tùy thuộc vào cơ thể) liên tục gấp nó ra để làm cho c3
một biểu thức liên tục, và sau đó liên tục gấp nó vào bất cứ nơi nào nó được sử dụng và không phân bổ nó. Đối với c4
, LTO có thể mang lại giá trị là c4
như một biểu thức không đổi, trong trường hợp này, nó có thể được gấp và xóa liên tục.
Trong C++ 11 có constexpr
chức năng cho phép nhiều việc khác được thực hiện trong khu vực này.
Điều gì đã xảy ra với 'c2'? –