2016-08-31 19 views
31

C++ 11 giới thiệu std::to_string, vì vậy tôi đã xem xét một triển khai: nó gọi vsnprintf nội bộ. Được rồi, nhưng tại sao nó luôn đặt tham số kích thước gấp 4 lần kích thước của loại?Tại sao việc triển khai std :: to_string tạo bộ đệm 4 lần kích thước của loại?

inline string 
to_string(int __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(int), 
              "%d", __val); } 

inline string 
to_string(unsigned __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 
              4 * sizeof(unsigned), 
              "%u", __val); } 

inline string 
to_string(long __val) 
{ return __gnu_cxx::__to_xstring<string>(&std::vsnprintf, 4 * sizeof(long), 
              "%ld", __val); } 
+0

nó sẽ tạo bộ đệm đủ lớn để chứa chuỗi cộng với dấu 0 cho tất cả các kích cỡ của int, từ 1 trở lên. –

+8

Đánh giá miễn phí: họ thực sự nên sử dụng 'sizeof __val' theo ý kiến ​​của tôi. – unwind

Trả lời

42

Số lượng tối đa các chữ số nhị phân của giá trị thập phân N là giá trị ceil của (N * log (10)/log (2)). Một chữ số thập phân đơn cần ceil (3,32) chữ số nhị phân, Đó là 4.

Đối với kích thước 8 bit đó là:

Decimals = ceil(8 * Size/3.32) = ceil(2.41 * Size). 

Đối với dấu (overhead và phân bổ) bạn nhận được:

Decimals = 4 * Size. 

Lưu ý: Chuyển đổi có dấu vân tay của một ký tự char cần có 5 byte (bao gồm ký hiệu và số không kết thúc). Đối với các giá trị có kích thước lớn hơn một byte, Decimals = 4 * Size cung cấp kết quả đủ lớn.

+0

Chỉ vì tò mò, bạn đã tìm thấy phương trình này như thế nào? – Garf365

+2

@ Garf365 đây là một sự thay đổi của cơ sở, số được mã hóa trong cơ sở 2 (nhị phân), và được viết trong cơ sở 10. – dkg

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