Có. Một biến C++ có thể vừa const vừa volatile.
Khi nào dùng?
- Read-only hardware register: Thanh ghi chỉ đọc của phần cứng (ví dụ: bộ đếm timer, cờ trạng thái). Chương trình không ghi vào nó (
const) nhưng giá trị thay đổi bởi phần cứng (volatile). - Output của thread khác: Vùng bộ nhớ được ghi bởi thread/hardware khác, thread hiện tại chỉ đọc.
Ví dụ
// Thanh ghi trạng thái chỉ đọc của hardware (địa chỉ cố định)
const volatile uint32_t* STATUS_REG = reinterpret_cast<uint32_t*>(0x40001000);
void checkStatus() {
uint32_t status = *STATUS_REG; // Luôn đọc thực từ địa chỉ, không cache
if (status & 0x1) { ... }
}
Giải thích
const: Code của bạn không ghi vào địa chỉ này.volatile: Giá trị có thể thay đổi bất cứ lúc nào bởi yếu tố bên ngoài (hardware, thread khác), trình biên dịch không được cache giá trị trong register.
Lưu ý: Thứ tự const volatile hoặc volatile const đều hợp lệ và tương đương.