[Go] 변수 메모리영역

natae·2022년 8월 11일
0

Golang

목록 보기
2/11

개요

  • golang의 변수 타입별 메모리영역 확인

코드

// go 1.18
package study

import "fmt"

type Pos struct {
	x, y int
}

var globalPos Pos
var globalPosPtr *Pos
var globalNum int
var globalNumPtr *int
var globalSlice []int = make([]int, 2)
var globalSlicePtr *[]int
var globalMap map[int]int
var globalMapPtr *map[int]int
var globalChan chan int
var globalChanPtr *chan int

func VariableTest() {

	localPos := Pos{}
	localPosPtr := &Pos{}

	var localNum int
	var localNumPtr *int

	var localSlice []int
	localSlice = []int{1, 2}
	var localSlicePtr *[]int

	var localMap map[int]int
	var localMapPtr *map[int]int

	var localChan chan int
	var localChanPtr *chan int

	fmt.Printf("globalPos:\t %p\n", &globalPos)
	fmt.Printf("globalNum:\t %p\n", &globalNum)
	fmt.Printf("globalSlice:\t %p %p %p\n", &globalSlice, &globalSlice[0], &globalSlice[1])
	fmt.Printf("globalMap:\t %p\n", &globalMap)
	fmt.Printf("globalChan:\t %p\n", &globalChan)

	fmt.Printf("globalPosPtr:\t %p\n", &globalPosPtr)
	fmt.Printf("globalNumPtr:\t %p\n", &globalNumPtr)
	fmt.Printf("globalSlicePtr:\t %p\n", &globalSlicePtr)
	fmt.Printf("globalMapPtr:\t %p\n", &globalMapPtr)
	fmt.Printf("globalChanPtr:\t %p\n", &globalChanPtr)

	fmt.Printf("localPos:\t %p\n", &localPos)
	fmt.Printf("localNum:\t %p\n", &localNum)
	fmt.Printf("localSlice:\t %p %p %p\n", &localSlice, &localSlice[0], &localSlice[1])
	fmt.Printf("localMap:\t %p\n", &localMap)
	fmt.Printf("localChan:\t %p\n", &localChan)

	fmt.Printf("localPosPtr:\t %p\n", &localPosPtr)
	fmt.Printf("localNumPtr:\t %p\n", &localNumPtr)
	fmt.Printf("localSlicePtr:\t %p\n", &localSlicePtr)
	fmt.Printf("localMapPtr:\t %p\n", &localMapPtr)
	fmt.Printf("localChanPtr:\t %p\n", &localChanPtr)
}

출력

globalPos:	 0x104d13100
globalNum:	 0x104d12ef8
globalSlice:	 0x104ce4250 0x1400012c010 0x1400012c018
globalMap:	 0x104ce3df0
globalChan:	 0x104ce3de0
globalPosPtr:	 0x104ce3e08
globalNumPtr:	 0x104ce3e00
globalSlicePtr:	 0x104ce3e10
globalMapPtr:	 0x104ce3df8
globalChanPtr:	 0x104ce3de8
localPos:	 0x1400012c020
localNum:	 0x1400012c008
localSlice:	 0x1400011e018 0x1400012c040 0x1400012c048
localMap:	 0x14000126030
localChan:	 0x14000126040
localPosPtr:	 0x14000126018
localNumPtr:	 0x14000126020
localSlicePtr:	 0x14000126028
localMapPtr:	 0x14000126038
localChanPtr:	 0x14000126048

추론

  1. 전역 변수와 로컬 변수의 메모리 주소 영역이 완전히 다름
  2. 메모리 영역은 일반 변수, Slice 포인터 변수, 포인터 변수 세 영역으로 나뉨
  3. map, chan은 기본적으로 포인터(기본형, 포인트형의 메모리 영역이 동일), Slice도 포인터지만 별도의 영역을 사용
  4. 로컬 및 전역 Slice의 원소의 메모리 영역은 일반 로컬 변수의 영역과 동일

결론

  1. 전역 변수는 로컬 변수보다 메모리 주소대가 낮음
    -> 전역 변수는 데이터 영역
  2. 로컬 일반 변수는 로컬 포인터 변수보다 메모리 주소대가 높음
    -> 로컬 일반 변수는 스택 영역, 로컬 포인터 변수는 힙 영역
  3. (몇차례 더 테스트 해본 결과) 로컬 Slice 변수는 메모리 주소대가 랜덤
    -> Slice는 포인터이고, 가비지컬렉션에 의해 정리되므로 힙 영역으로 추정
profile
서버 프로그래머

0개의 댓글