2012-10-13 38 views
6

Thông thường, bignums được thực hiện bằng cách sử dụng nhiều từ, nhưng tôi muốn chọn kích thước từ càng nhiều càng tốt. Điều này là khó khăn hơn nó có vẻ - std::uint64_t có sẵn trong nhiều trình biên dịch 32-bit, nhưng std::uint32_t có lẽ sẽ là một lựa chọn tốt hơn trên một máy 32-bit. Vì vậy, sự cám dỗ sau đó sẽ sử dụng std :: size_t, nhưng không đảm bảo cho một kiến ​​trúc nhất định rằng std::size_t là loại hiệu quả nhất cho số học, ví dụ: the new x32 Linux ABIstd::size_t sẽ là 32 bit nhưng std::uint64_t vẫn sẽ là lựa chọn tốt nhất.Xác định kích thước từ hiệu quả nhất để triển khai bignums trong C++ 11?

C++ 11 có các loại kích thước khác nhau được xác định nhanh, ít nhất, nhưng không cung cấp bất kỳ cách nào để truy vấn hiệu suất tương đối của chúng. Tôi nhận ra có thể không có câu trả lời di động tốt nhất, dự đoán tốt nhất của tôi bây giờ là để mặc định để std::size_t và phát hiện kiến ​​trúc đặc biệt tại thời gian cấu hình. Nhưng có lẽ có một cách tốt hơn?

+4

Vâng, tôi nghĩ uint_fast32_t hoặc uint_fast64_t có thể là giải pháp tốt nhất. Nó sẽ ít nhất đảm bảo tốc độ và ít nhất 32/64 bit cho các kiểu dữ liệu của bạn. Đó có lẽ là ý nghĩa của chúng. – Morwenn

+0

"* C++ 11 yêu cầu rằng std :: uint64_t tồn tại ví dụ *" Không, nó không. Nó là tùy chọn. Ngoài ra: "* nhưng std :: uint32_t có lẽ sẽ là lựa chọn tốt hơn trên máy 64 bit *" Tôi giả sử bạn có nghĩa là "** máy 32 bit **" –

+0

@NicolBolas: Rất tiếc, bạn đã chính xác cả hai số. –

Trả lời

5

Chìa khóa thực sự thực hiện hiệu quả là bạn cần phải có một nhân rộng hơn cung cấp cho bạn gấp đôi số bit như kích thước từ cơ bản của bạn. Vì vậy, bạn chỉ có thể sử dụng uint64_t làm kích thước từ cơ bản nếu nền tảng của bạn hỗ trợ kết quả nhân 128 bit. Kích thước của con trỏ trên máy của bạn phần lớn không liên quan.

Nếu bạn thực sự muốn triển khai hiệu quả nhất có thể xách tay nhất có thể, bạn nên chọn kích thước từ ở thời gian biên dịch. Sau đó, có một kịch bản tự động cấu hình (cố gắng) xây dựng mã với các kích thước từ khác nhau và kiểm tra kết quả của các bản dựng đó cho tính chính xác và tốc độ.

#define WORD_(SIZE) std::uint ## SIZE ## _t 
#define WORD(SIZE)  WORD_(SIZE) 
#define X2_(SIZE)  X2_ ## SIZE 
#define X2(SIZE)  X2_(SIZE) 
#define X2_8   16 
#define X2_16   32 
#define X2_32   64 
#define X2_64   128 

sử dụng WORD(WORD_SIZE)WORD(X2(WORD_SIZE)) trong mã của bạn và biên dịch với
-DWORD_SIZE=8 hoặc 16 hoặc 32 hoặc 64

Các vấn đề liên quan