簡體   English   中英

無限的緩沖區printf-格式化后直接放入流

[英]unlimited buffer printf - formatted puts directly to stream

我的理解是,大多數printf的實現都依賴於

vsnprintf( _acBuffer[0], sizeof( _acBuffer[0] ), pcFormat, *ptArgList );

實際處理格式,然后通過puts將其輸出到流中。

是否有任何實現可以在保持打印所有字符串的能力的同時最小化_acBuffer [0]的大小?

顯然是這樣的:

printf("%s", pcReallyLongString);

會是個問題。

非常感謝您的想法!

您的理解是錯誤的。 我從未見過或聽說過通過首先將整個輸出格式化為臨時字符串緩沖區而起作用的printf實現。 通常,printf是通過另一種方式完成的:基本構建塊是vfprintfvsnprintf是包裝器,用於創建偽造的FILE其緩沖區是目標字符串。

編輯:一些流行的實現(例如glibc) 確實對某些格式使用了無窮大的中間緩沖區,尤其是寬字符轉換,並且當它們不能為緩沖區分配足夠的內存時將無法預料地失敗。 但是,這純粹是一個低質量的實現問題。 沒有根本的原因,無論打印什么功能,任何printf函數都只需要少量恆定的工作空間即可。

我要說的是, fprintf (或printf )規范的全部要點是允許該函數的“無緩沖”單遍實現的方式。 即,它逐段順序地轉換數據(如果需要轉換),立即將其發送到輸出,並永遠忘記它。 該函數可以使用中間緩沖區進行數值數據轉換,但這是一個固定且無關緊要的編譯時大小的臨時緩沖區。

除非我缺少任何東西,否則正確實現的fprintf函數應該絕對不限制結果字符串的長度。 通過vsnprintf假設實現將違反該原則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM