Trình biên dịch CPP nói chung (g ++) thực hiện một số tối ưu hóa cho mã. Vì vậy, khi bạn khai báo một biến đăng ký, không cần thiết trình biên dịch sẽ lưu trữ giá trị đó trực tiếp trong thanh ghi. (ví dụ) mã 'đăng ký int x' có thể không dẫn đến trình biên dịch lưu trữ int đó trực tiếp trong thanh ghi. Nhưng nếu chúng ta có thể buộc trình biên dịch làm như vậy, chúng ta có thể thành công.
Ví dụ: nếu chúng tôi sử dụng đoạn mã sau, thì chúng tôi có thể buộc trình biên dịch thực hiện những gì chúng tôi mong muốn. Việc biên dịch đoạn mã sau đây có thể bị lỗi, điều này cho biết rằng int thực sự được lưu trữ trực tiếp trong thanh ghi.
int main() {
volatile register int x asm ("eax");
int y = *(&x);
return 0;
}
Đối với tôi, trình biên dịch g ++ đang ném lỗi sau trong trường hợp này.
[[email protected] cpp]$ g++ register_vars.cpp
register_vars.cpp: In function ‘int main()’:
register_vars.cpp:3: error: address of explicit register variable ‘x’ requested
Dòng 'bay hơi đăng ký int x asm ('eax')' được hướng dẫn trình biên dịch rằng, lưu trữ các số nguyên x trong 'eax' đăng ký và khi làm như vậy không làm bất cứ việc tối ưu. Điều này sẽ đảm bảo rằng giá trị được lưu trữ trong sổ đăng ký trực tiếp. Đó là lý do tại sao truy cập vào địa chỉ của biến là ném một lỗi.
Hoặc, trình biên dịch C (gcc), có thể bị lỗi với chính đoạn mã sau.
int main() {
register int a=10;
int c = *(&a);
return 0;
}
Đối với tôi, trình biên dịch gcc đang ném lỗi sau trong trường hợp này.
[[email protected] cpp]$ gcc register.c
register.c: In function ‘main’:
register.c:5: error: address of register variable ‘a’ requested
Nguồn
2014-08-04 08:32:11
C và C++ không đảm bảo rằng phần cứng mà chương trình đang chạy thậm chí có "đăng ký". Nó chỉ là một gợi ý cho trình biên dịch. –
Tại sao bạn quan tâm? – delnan
@StephenCanon Không chỉ đơn thuần là một gợi ý trong C, tuyên bố một biến 'đăng ký' cấm lấy địa chỉ của nó ở đó. (Nó không phải là nhiều hơn có thể là một gợi ý như xa như việc đặt các biến thực sự trong một đăng ký là có liên quan.) –