Có một thư viện mà tôi xây dựng dựa trên các nền tảng 32 bit khác nhau. Bây giờ, kiến trúc 64-bit phải được hỗ trợ. Các chiến lược chung nhất để mở rộng mã 32 bit hiện có để hỗ trợ kiến trúc 64 bit là gì? Tôi có nên sử dụng # ifdef hoặc bất kỳ thứ gì khác không?Thêm hỗ trợ 64 bit vào mã 32 bit hiện tại, có khó không?
Trả lời
Số lượng nỗ lực liên quan sẽ phụ thuộc hoàn toàn vào cách viết mã ban đầu. Trong trường hợp tốt nhất có thể sẽ không có nỗ lực nào khác ngoài việc biên dịch lại. Trong trường hợp xấu nhất, bạn sẽ phải mất rất nhiều thời gian làm cho mã của bạn "64 bit sạch".
vấn đề điển hình là:
- giả định về kích thước của int/dài/con trỏ/etc
- con trỏ gán < => ints
- dựa vào đối số mặc định hoặc chuyển đổi kết quả chức năng (tức là không có nguyên mẫu hàm)
- thông số định dạng printf/scanf không phù hợp
- giả định về kích thước/căn chỉnh/đệm của cấu trúc (đặc biệt là đối với tệp hoặc mạng I/O) , Hoặc giao tiếp với các API khác, vv)
- phôi không phù hợp khi thực hiện con trỏ số học với byte offset
Đơn giản chỉ cần không dựa vào giả định về kích thước từ máy? luôn sử dụng sizeof, stdint.h, v.v. Trừ khi bạn dựa vào các cuộc gọi thư viện khác nhau cho các kiến trúc khác nhau, không cần phải có #ifdefs.
Chiến lược đơn giản nhất là để xây dựng những gì bạn có với các thiết lập 64-bit và kiểm tra các heck ra khỏi nó. Một số mã không cần phải thay đổi chút nào. Mã khác, thường với các giả định sai về kích thước của int/con trỏ sẽ dễ vỡ hơn nhiều và sẽ cần được sửa đổi để không phụ thuộc vào kiến trúc.
Các tệp nhị phân thường chứa bản ghi nhị phân gây ra nhiều sự cố nhất. Điều này đặc biệt đúng trong các môi trường mà ints tăng từ 32-bit lên 64-bit trong quá trình chuyển đổi sang bản dựng 64 bit. Chủ yếu điều này là do thực tế là các số nguyên được viết tự nhiên cho các tệp trong chiều dài hiện tại (32 bit) của chúng và đọc bằng cách sử dụng độ dài không chính xác trong bản dựng 64 bit trong đó int là 64 bit.
Nó phụ thuộc vào trình biên dịch của khóa học, nhưng tất cả các trình biên dịch C 64 bit tôi đã sử dụng (gcc, clang), để 'int' ở 32 bit và tạo bit dài 64 bit. – JeremyP
@JeremyP: Nó phụ thuộc vào mô hình dữ liệu nền tảng (http://en.wikipedia.org/wiki/64-bit#Specific_C-language_data_models) thay vì trình biên dịch. Ví dụ trên Win64 cả 'int' và' long' vẫn là 32 bit, trong khi 'long long' là 64 bit, vì vậy mô hình giống với Win32 cho số nguyên, nhưng con trỏ trở thành 64 bit, do đó mã cố gắng sử dụng' int' hoặc 'long' để giữ giá trị con trỏ sẽ không thành công - thay đổi thành' intptr_t' nếu cần. – Clifford
- 1. Lỗi lắp ráp: Mach-O 64 bit không hỗ trợ địa chỉ 32 bit tuyệt đối
- 2. 32 bit int * 32 bit int = 64 bit int?
- 3. Java JDK 32 bit và 64 bit
- 4. Mono có hỗ trợ Windows 64 bit không?
- 5. SDK Android 32 bit hoặc 64 bit trên hệ điều hành Windows 64 bit?
- 6. 64 bit bằng cách phân chia 32 bit
- 7. Xác định xem quy trình PowerShell hiện tại là 32 bit hay 64 bit?
- 8. Chạy dll 32 bit trên máy 64 bit trong java
- 9. Có thể truy cập dll 64 bit từ ứng dụng 32 bit không?
- 10. Cách di chuyển hai thanh ghi 32 bit vào một bit 64 bit?
- 11. Eclipse 32 bit chạy trên 64 bit JVM
- 12. Xây dựng 32 bit với 64-bit llvm-gcc
- 13. windows 7 64 bit không đúng PATH khi tải thư viện 32 bit cho 32 bit exe
- 14. .net InstallUtil utility - 32 bit vs 64 bit
- 15. Tạo 32 bit JavaFX Native Bundle trong máy 64 bit
- 16. Ứng dụng 32 bit hoặc 64 bit trên hệ điều hành 64 bit?
- 17. Lỗi AJAX ASP.NET AJAX/32-bit đến 64-bit
- 18. Trong các hệ thống 64 bit, một cột 32 bit chiếm ít không gian hơn một bit 64 bit?
- 19. Nhập 32 bit dll trong 64 bit .Net application
- 20. Xác định Windows 64 bit so với 32 bit
- 21. QtCreator trên linux: 32 bit so với 64 bit
- 22. Chuyển đổi 32 bit dll sang 64 bit dll
- 23. Biên dịch 32 bit Assembler trên 64 bit ubuntu
- 24. chạy nhị phân 32 bit trên máy 64 bit
- 25. Hệ điều hành iPhone 64 bit hay 32 bit?
- 26. Không thể tìm thấy crtn.o, liên kết mã 32 bit trên hệ thống 64 bit
- 27. D hỗ trợ 64 bit như thế nào?
- 28. Có lâu luôn 64 bit trong cả máy 32 và 64 bit
- 29. Có sự khác biệt nào cho Integer.MAX_VALUE giữa JVM 32 bit và JVM 64 bit không?
- 30. Biên dịch mã nhị phân OS X 32 bit trên môi trường 64 bit
+1 Chỉ một số bổ sung: Trường hợp khó chịu cho đối số nguyên là hàm va_arg: tất cả các loại số nguyên hẹp tương ứng với '...' sẽ được chuyển thành 'int'. Sau đó, mã sử dụng số nguyên 'typeof' với ngữ nghĩa chính xác như 'size_t',' uintptr_t', 'ptrdiff_t',' uint64_t' sẽ thường chỉ biên dịch và chạy. Mã có sự lạm dụng cho 'int' ở khắp mọi nơi dưới dạng biến vòng lặp, làm số học' char' quên rằng điều này có thể được ký hoặc chưa ký, và những thứ như thế đang tìm kiếm sự cố. Chạy mã của bạn thông qua các trình biên dịch khác nhau với tất cả các cảnh báo, 'clang' là một bổ sung tốt cho' gcc' –
@Jens: cảm ơn các nhận xét bổ sung - điểm về xây dựng và thử nghiệm với nhiều trình biên dịch là một điều rất tốt. –