Bộ chỉ lệnh x86-64 thêm nhiều thanh ghi và các cải tiến khác để giúp hợp lý hóa mã thực thi. Tuy nhiên, trong nhiều ứng dụng, kích thước con trỏ tăng lên là một gánh nặng. Các byte thừa, không sử dụng trong mỗi con trỏ làm tắc nghẽn bộ nhớ cache và thậm chí có thể tràn bộ nhớ RAM. GCC, ví dụ, xây dựng với cờ -m32
, và tôi cho rằng đây là lý do.Con trỏ 32 bit với ISA x86-64: tại sao không?
Có thể tải giá trị 32 bit và coi nó là con trỏ. Điều này không đòi hỏi thêm hướng dẫn, chỉ cần tải/tính toán 32 bit và tải từ địa chỉ kết quả. Tuy nhiên, mẹo này không thể di chuyển được vì các nền tảng có các bản đồ bộ nhớ khác nhau. Trên Mac OS X, toàn bộ không gian địa chỉ 4 Gib thấp được đặt trước. Tuy nhiên, đối với một chương trình tôi đã viết, hãy thêm 0x100000000L
vào địa chỉ 32 bit "trước khi sử dụng hiệu suất được cải thiện rất nhiều so với địa chỉ 64 bit thực sự hoặc biên dịch với -m32
.
Có trở ngại cơ bản nào để có nền tảng 32 bit, x86-64 không? Tôi cho rằng việc hỗ trợ một con chimera sẽ thêm sự phức tạp vào bất kỳ hệ điều hành nào, và bất cứ ai muốn 20% cuối cùng đó chỉ nên Make it Work ™, nhưng có vẻ như đây là sự phù hợp nhất cho một loạt các chương trình tính toán chuyên sâu.
Dữ liệu lược tả trong phần lớn các ứng dụng cho thấy không có tổn thất đáng kể do kích thước con trỏ tăng lên. – Puppy
Trình biên dịch Intel có tùy chọn ['Qauto-ilp32'] (http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/cpp/lin/compiler_c/copts/ccpp_options/option_qauto_ilp32 .htm) "cố" sử dụng 32 bit cho con trỏ - ngay cả ở chế độ x64. – Mysticial
@Mysticial nhưng đó giống như con trỏ 'gần' và' far' lỗi thời, đúng không? Đó là giải pháp là OK, tôi cho rằng, nhưng nó không phải là khá sạch như là tôi đang đề cập đến. – Potatoswatter