読んだ後null で終了する文字列の根拠は何ですか? また、C#/.Net の文字列は、内部的には、 BSTR Data Typeのように長さのプレフィックスと null で終了することがわかったいくつかの同様の質問があります。
文字列が長さのプレフィックスと null の両方で終了する理由は何ですか? 長さの接頭辞のみ?
読んだ後null で終了する文字列の根拠は何ですか? また、C#/.Net の文字列は、内部的には、 BSTR Data Typeのように長さのプレフィックスと null で終了することがわかったいくつかの同様の質問があります。
文字列が長さのプレフィックスと null の両方で終了する理由は何ですか? 長さの接頭辞のみ?
計算の長さが。になるように接頭辞が付けられた長さO(1)
。
アンマネージドブレイジングへのマーシャリングを高速化するためにヌル終了しました(アンマネージドはヌル終了文字列を想定している可能性があります)。
以下は、文字列に関するJon Skeet のブログ投稿からの抜粋です。
API に関する限り、文字列は null で終了しませんが、文字配列は null で終了します。これは、inter-op で文字列がUnicode としてマーシャリングする必要があります。
ほとんどの場合、COM との簡単な相互運用性を確保するためです。
length フィールドを使用すると、フレームワークが文字列の長さを簡単に判断できます (また、文字列にゼロ値の文字を含めることができます) が、フレームワーク (またはユーザー プログラム) が処理する必要があるものは非常に多くあります。 NULL で終了する文字列。
たとえば、Win32 API のように。
そのため、文字列データの末尾に NULL ターミネータを付けておくと便利です。これは、いずれにせよかなり頻繁に必要になるからです。
C++ のstd::string
クラスは同じ方法で実装されていることに注意してください (とにかく MSVC で)。同じ理由で、確かに (は、C スタイルの文字列が必要なものにc_str()
a を渡すためによく使用されます)。std::string
最良の推測は、長さを見つけることは、それをトラバースしてO(n)で実行する場合と比較して、一定(O(1))であるということです。