Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Game Boy Emulator作成で学んだ Golangのメモリライフタイム

Game Boy Emulator作成で学んだ Golangのメモリライフタイム

DMM.go#8で登壇した際の発表資料です

connpass
- https://dmm.connpass.com/event/322113/

あつまるくん

July 29, 2024
Tweet

Other Decks in Technology

Transcript

  1. © DMM 自己紹介
 清水 諄孔
 GitHub: atsumarukun
 入社: 2024年 新卒入社


    所属: 開発統括本部
  テックリード室
 趣味: PCに触れること
  OS開発経験
 2
  2. © DMM 開発の流れ
 1. 各種メモリを実装
 2. CPUを実装
 3. PPUを実装
 4.

    LCDを実装
 5. サイクルベースでエミュレータを実装
 6. カートリッジを実装
 7. Joypadを実装
 8. APUを実装
 9
  3. © DMM 開発の流れ
 1. 各種メモリを実装
 2. CPUを実装
 3. PPUを実装
 4.

    LCDを実装
 5. サイクルベースでエミュレータを実装
 6. カートリッジを実装
 7. Joypadを実装
 8. APUを実装
 10
  4. © DMM サンプルプログラム
 uint8_t* address; 
 void function(void) { 


    uint8_t variable = 1; 
 printf("%p\n", &variable); // -> 0xffffe469565f 
 address = &variable; 
 }
 int main(void) { 
 function();
 printf("%p\n", address); // -> 0xffffe469565f 
 printf("%d\n", *address); // -> 102
 return 0;
 }
 関数内のアドレスと、グローバル変数のポ インタの値は等しくなります。
 アドレスの値を見ると、1になっていないこ とがわかります。
 C言語
 28
  5. © DMM サンプルプログラム
 var address *uint8
 
 func main() {


    (func() {
 var variable uint8 = 1
 fmt.Printf("%p\n", &variable) // -> 0xffffe469565f
 address = &variable
 })()
 fmt.Printf("%p\n", address) // -> 0xffffe469565f
 fmt.Println(*address) // -> 1
 }
 C言語同様、アドレスの値は関数内とグ ローバル変数で等しくなります。
 しかし、アドレスの値を見ると1のままであ ることがわかります。
 
 Go言語
 29
  6. © DMM 依存関係の逆転
 type AccountRepository Interface {} type Account struct

    { db *sql.DB } func NewAccount(db *sql.DB) AccountRepository { return &Account{ db: db, } } 関数の戻り値で直接構造体のアドレスを返 すことができます。
 これにより、関数の戻り値に
 Interfaceを指定が可能になります。
 30