Swiftのスタック変数とCPUレジスタの関係を読み解いた by rikusouda

iOSDC Japan 2019
採択
2019/09/07 15:55〜
Track A
LT(5分)

Swiftのスタック変数とCPUレジスタの関係を読み解いた

rikusouda rikusouda rikusouda

このLTはコードの解説というよりは体験共有に比重を置いたLTです

Swiftの関数内でIntのような型(struct)のインスタンスを確保すると、スタックのメモリ領域に格納されるということは過去のWWDCセッションでも語られています。「スタック」とはメインメモリ上の領域です。CPUが演算をするときには「レジスタ」という高速なデータ領域を利用します。メインメモリはCPUのレジスタに比べてとてもアクセス速度が遅いことが知られています。一般的には変数は「スタック」に確保することになっていますが、実際にはCPUレジスタを使って高速化したほうがよい気がしますよね? しているはずですよね? でも確証がありません。

決してSwiftコンパイラに詳しくない私は自分で調査するという発想になかなかならず、疑問を抱えたまま過ごしていました。
WWDC19に参加することができたので、かねてよりの疑問をのラボで聞きました。しかし直接の回答にはたどり着けません。いただいたアドバイスは「LLVM IRとかアセンブラ読むといろいろわかって面白いよ」と。
覚悟を決めて、LLVM IRやARM64のアセンブラを読みました。

雰囲気で「こう動いている気がする」と思っていたことが明確になり「Swiftわからない」という気持ちが減りました。そして、その過程はとても面白い体験となりました。

決してSwiftコンパイラに詳しくない私が、どのように結論にたどり着いたのかの体験を共有します。