コンパイルの文字列の後ろの謎 - データ構造を探索します

我々はまだ多くの文字列型を使用してプログラムを書く場合、文字列は、私は、誰もが精通していると信じています。だから、多くの場合、あなたは本当にそれを「理解」、それを使うのか?ステップバイステップは、あまりにも「人」のようなものかどうか、それを見て、その神秘的なベールを開いて、質問をお受けしてください!

まず、考えます

文字列を使用するプロセスにおけるスウィフトの開発は、次の問題について考えていますか?

  • 文字列変数のためにどのくらいのメモリ?
  • 文字列str1は、違いは何ですか基盤となるストレージのstr2の?

    コンパイルの文字列の後ろの謎 - データ構造を探索します

  • スプライシング操作STR1、STR2、STR1、STR2は、ストレージの基礎となる場合はどう変わりますか?

    コンパイルの文字列の後ろの謎 - データ構造を探索します
    あなたは正確にこれらの質問に答えることができれば、それは、基礎となるストレージ・メカニズムスウィフト文字列はかなり意識していることを示しています。

    第二に、どのくらいのメモリ文字列変数の職業?

方法1:MemoryLayout

まず、スウィフトを助けることができるテストはMemoryLayoutが来ます
コンパイルの文字列の後ろの謎 - データ構造を探索します

方法2:アセンブラ

また、我々はまた、強い下でアシスタントを分析することができます - アセンブリ言語、文字列の基盤となるストレージで覗いて

  • 実際、他の文法的分析では、基盤となるシステムライブラリは、あなたがアセンブリ言語を利用することができます

    • そのような多型一般的な原理は、Arrayの基本原則などを列挙下
  • また、だけでなくスウィフト、C、C ++、OC基礎となる分析、まだアセンブリ言語を利用することができます

    • 結局のところ、あなたは最終的に機械語命令(0と1)に有効にする必要がありますが、コードの各行が有効である書きます
    • アセンブリ命令を有する機械命令が1に一つであり、各マシン命令は、対応するアセンブリ命令に翻訳することができます
    • アセンブラ命令は、読み取ることができる機械語命令と同等のものを読むことができる、(操作を登録するものを、メモリ操作の一部)CPUの既知の特定のやっ
  • このチュートリアルのコードは、Macのコマンドライン上で直接実行されている(CommandLineTools)プロジェクト
    • 従って、コードフォーマットは、AT&T X64のコンパイルではなく、実際のマシンのiOS ARMアセンブリデバイスに基づいているアセンブリを示し
    • 実際には、いくつかの手順については、異なるアセンブリのようなものではなく、同じ名前の間には大きな類似性があります

MicrosoftのVisual Studioのと同じように、Xcodeのは非常に便利な分解機能を内蔵しており、簡単に次の手順を実行し、それぞれに組立説明書、解体オープンインタフェースに対応するコードを表示することができます

  • デバッグコードの行を必要としているブレークポイントの付いた(逆アセンブルインターフェースは、ブレークポイントデバッグ状態に表示されます)

  • メニュー:Debug> Debug Workflow>Always Show Disassembly

    • Assembly翻訳コンパイル、Disassembly逆アセンブルし翻訳

    コンパイルの文字列の後ろの謎 - データ構造を探索します

  • プログラムを実行し、解体インタフェースを参照してください

    コンパイルの文字列の後ろの謎 - データ構造を探索します

あなたは完全な経験を分解した場合、16のコンパイルによると、17行が出て洗練することができ、文字列の占有率は16のバイトです

  • それはRAXを使用しているため、店舗に文字列str、およびRAXの内容を登録RDX、RDXは8つのバイトです

コンテンツのコンパイルはあまりにも多く、ための時間との関係の長さの、記事はアセンブリ命令の一つ一つを詳細に説明していませんが、より多くのコンパイルの重要性を説明することです。

第三に、基礎となるの保存された文字列

スヌープメモリ

以前、私が書いたガジェットをスパイすることができ、可変メモリスウィフト:https://github.com/CoderMJLee/Mems

  • 今、データが保存されているまさに、16バイトの文字列をてこのようにそれを使用します

  • Mems.memStr(ofVal:) ディスプレイのデフォルトにメモリデータの8バイトの集合によると

  • パラメータを渡すalignment: .one表示メモリに1バイトのデータのセットに従って
    コンパイルの文字列の後ろの謎 - データ構造を探索します

文字「0」 - 「9」ASCII値0x30を〜ます。0x39は、慎重に最初の16バイトのデータをSTR1を観察し、あなたは何を見つけますか?

  • また、直接STR1 16バイト店のASCII値のすべての文字

  • 最後はバイト0xeaは0xaの文字数が、また、10文字の合計であります

    スプライス

    コンパイルの文字列の後ろの謎 - データ構造を探索します
    の「ABCDE」をステッチするときにはSTR1で見つけることができます

  • これは、最終的には15の文字がSTR1の16バイトに格納されているASCII値「0123456789ABCDE」であります

  • 最後はバイト0xEFという0xFの中の文字の数が、また、15文字の合計であります

  • 見ることができ、現在いっぱいである、文字であれば、それをステッチすることを16バイトを持っていますか?

    コンパイルの文字列の後ろの謎 - データ構造を探索します

あなたが見ることができる、非常に大きな変化は、各文字のASCII値がなくなって行われたデータ保存STR1、

  • まさにそれの意味は何16バイトがあることは?

  • ASCII値のすべての文字(「F」と「0」〜「9」、「A」)とどこへ行くそれを維持?

その他の例

あなたが(ないステッチの前に)初期化時間を開始した場合、文字列の内容は、15文字を超えているのですか?

コンパイルの文字列の後ろの謎 - データ構造を探索します

私は、あなたが結果を推測することができると信じて

  • これは16のバイトで、文字のASCII値のない外観はありません
  • そして、これらの16のバイトと第27行的str1異なりますか
    • その内容は、文字列「0123456789ABCDEF」ですが、

もしstr2のスプライシング操作
コンパイルの文字列の後ろの謎 - データ構造を探索します

見つけるのは難しいことではありません:16バイトSTR2、その後で、再度変更第27行的str1同様のビット

これらの疑問を解決する方法は?

これらの質問の上に、データメモリのプリントアウトを見ては解決できませんが、[使用することができます!コンパイル!]組み立て説明書を分析し、解決するために、すぐに理由は記事の限られたスペースのため、結論に来て、通常はあまりにも忙しい作業、私は問題を記録するプロセスの詳細な分析を置くと、ビデオ、興味のある友人の2時間以上までになってきましたそれは、鑑賞の1.5〜2倍の速度かもしれ

  • リンク:https://pan.baidu.com/s/1AkS3K1ZKP8zyxhlhLRaBkA

    • 抽出コード:kzrk
  • 友人の編集ビデオのための根拠はありませんが、それは少し難しいかもしれ、それは地味な時間見を選ぶのがベストです

  • ビデオを見た後、私はあなたが言語の重要性を正確にコンパイルを感じることができると思いますし、常に高レベル言語、シンタックスシュガーレベルでふけるで書かれたコードで停止しません。

第四に、そして最終的に

アセンブリ言語は基本言語プログラミングですが、彼らは私たちの最も使用されるコンピュータ言語ですが、日常の生活の中であなたの仕事でだけではないアプリケーションは、あなたが楽しいを割ることができるソフトウェアとして、また使用することができます、オープンプラグなど。
コンパイルの文字列の後ろの謎 - データ構造を探索します
私は、IT業界の人々のいくつかの年のベテランとして、確かにあなたが手動でできる、あなたはより多くの自由なプログラミングの学習リソースと乾燥を取得したい場合は、通常、共有にあなたを与えるだろう、より多くの経験と資源を蓄積しマイクロ手紙を追加:19950277730を!私と一緒にそれをプログラミングの世界を探検するには!

おすすめ

転載: blog.51cto.com/14598441/2449126