위에 허수들 싹 거르고 전역변수(gv)는 메모리 data영역에 저장함.
반멱 지역변수(lv)는 stack영역에 저장함.
이때 명시적초기화(ei)가 없다면, lv는 임의의 쓰레기값을 넣음.
하지만 gv는 bss, data segment에 의해서 각 데이터 타입에 맞는 zero-value로 초기화함 (int = 0, bool = false,string = "" 등)
즉, 초기화하는 과정이 귀찮아서 gv로 선언하는것이다. 그래서 시간이 금인 코딩테스트에서 많이 쓰이는거지.
익명(117.110)2023-03-31 21:42
그리고 이름있는 엔지니어들은 성능이나 프로그램 복잡도 면에서 stack에 할당하는 변수를 최고로 침. 이건 이미 정론이 났음.
구글의 go언어만든 롭파이크가 언급하기도 한 "idiomatic programming"에서도 나온바 있음.
반면 heap에 할당하는 변수를 가장 안좋게 봄.
메모리 자체가 Random Access Memory 라는 이름값을하기때문에 heap은 예측불가(첫 변수주소만)한 곳에 할당함.그래서 접근시 오버헤드발생함.
또한 할당을 수동으로 해제하거나, GC가 일을하게 하기때문에 코스트가 제일 큼.
익명(117.110)2023-03-31 21:52
답글
heap vs stack인 경우에 한해서 stack이 좋은거지 data 영역까지 포함하는 경우에도 stack이 더 좋다고 할 수 있는거였음? 이거에 대한 레퍼런스 있으면 좀 부탁함 궁금하네
익명(221.138)2023-03-31 22:09
답글
ㄴ 그 둘을 비교할때 성능면에서는 둘을 비교하는 의미가 없음(엄밀히 말하면 있기야하겠지만 참조랑 포인터차이정도).
보통 프로젝트의 규모가 팀단위로 이루어지기때문에 가독성면에서, 메모리 점유율 면에서 stack이 좋다는것임.
C++같은경우는 언리얼엔진쪽에서 전역변수를 _붙여서 표기하는게 컨벤션이고, 구글이나 서버분야는 g_를붙인다고 하드라. 회사마다 다르겠지뭐.
메모리 할당한계치도 전역변수가 더 큼. 스택은 OS가 제한을 타이트하게 잡아서 전역변수보다 배열길이를 조금밖에 못씀.
이게 왜 단점이냐라고 말하면, 난 제한을 많이 걸어둘수록 좋다고생각함. 이건 너도 공감할꺼야.
익명(117.110)2023-03-31 22:42
스택에 있는게 캐시히트 때문에 훨씬 빠름 전역을 쓰는건 귀찮아서 그런거고 유지보수이든 속도이든 될수있는한 전역은 자제하는 습관으로 들이길
익명(39.7)2023-03-31 22:45
전역은 추천하지 않지 유지보수도 어렵고
익명(58.232)2023-04-01 00:00
제한된 메모리가 아닌 이상은 가급적이면 전역 대신 스택 영역(로컬)을 쓰는게 맞음. 문제는 malloc(동적영역인 힙 메모리)인데, 메모리 할당과 해제는 성능 저하의 가장 큰 원인과 불안전을 야기함. 여기서 스태틱(글로벌) 변수를 써서 불필요한 동적할당을 피할 수 있다면 쓰는 것임. 그래야 함수가 호출되거나 반복할 때마다 불필요한 힙영역을 줄일 수 있음
익명(116.121)2023-04-01 04:42
답글
그래서 일부 아카데미 쪽이나 현장에서 c를 안 다루고 배우기만 하는 사람들은 마치 글로벌을 죄악시 하는데. 현장 c 현역 프로그래머 중에 글로벌 안 쓰는 사람 없음. 오히려 힙메모리를 죄악시하고 최대한 피하라고 하지. 글로벌은 필수적으로 써야함
아 미안 내가 깃갤밖에 안해서 생각 못했는데 이거 PS갤 가야하냐? - dc App
스택에 박는게 캐시때문에 더 빨름 함수에 넘겨주기 귀찮아서 전역으로 선언하는 거겠지
뭐야 전역이 더 빠른가 했더니 그것도 아닌거네? 전역변수 남발하는 것도 절대 좋지는 않아보이던데 평소 하던식으로 해야겠네 고마워! - dc App
구형 시스템에서는 전역이 더 느릴 수 있는데 이건 진짜 옛날 이야기고 속도 차이는 없다고 봐도 됨. 그런데 전역 변수가 꼭 필요한 상황이 아닌데 쓰는 건 좋지 않지.
코테는 걍 얼른 얼른 쓰기 편하니까 그러는거임 제대로 하려면 당연히 함수 인자로 받아야 하고 객체지향이면 싱글톤 쓰기도 하고 그럼 속도 차이는 원래 지역변수가 더 빠름
저녁변수 쓰면 안 되는 이유:
https://blog.kurcreative.com/kur1909300908
보통은 되려 느리지 그냥 편해서 그럼
캐시히트 때문에 전역변수가 지역변수보다 아주 극미하게 느릴 "확률" 은 있음
다들 알려주셔서 감사합니다 - dc App
지역변수도 최적화 경우 따라서 속도가 다름
위에 허수들 싹 거르고 전역변수(gv)는 메모리 data영역에 저장함. 반멱 지역변수(lv)는 stack영역에 저장함. 이때 명시적초기화(ei)가 없다면, lv는 임의의 쓰레기값을 넣음. 하지만 gv는 bss, data segment에 의해서 각 데이터 타입에 맞는 zero-value로 초기화함 (int = 0, bool = false,string = "" 등) 즉, 초기화하는 과정이 귀찮아서 gv로 선언하는것이다. 그래서 시간이 금인 코딩테스트에서 많이 쓰이는거지.
그리고 이름있는 엔지니어들은 성능이나 프로그램 복잡도 면에서 stack에 할당하는 변수를 최고로 침. 이건 이미 정론이 났음. 구글의 go언어만든 롭파이크가 언급하기도 한 "idiomatic programming"에서도 나온바 있음. 반면 heap에 할당하는 변수를 가장 안좋게 봄. 메모리 자체가 Random Access Memory 라는 이름값을하기때문에 heap은 예측불가(첫 변수주소만)한 곳에 할당함.그래서 접근시 오버헤드발생함. 또한 할당을 수동으로 해제하거나, GC가 일을하게 하기때문에 코스트가 제일 큼.
heap vs stack인 경우에 한해서 stack이 좋은거지 data 영역까지 포함하는 경우에도 stack이 더 좋다고 할 수 있는거였음? 이거에 대한 레퍼런스 있으면 좀 부탁함 궁금하네
ㄴ 그 둘을 비교할때 성능면에서는 둘을 비교하는 의미가 없음(엄밀히 말하면 있기야하겠지만 참조랑 포인터차이정도). 보통 프로젝트의 규모가 팀단위로 이루어지기때문에 가독성면에서, 메모리 점유율 면에서 stack이 좋다는것임. C++같은경우는 언리얼엔진쪽에서 전역변수를 _붙여서 표기하는게 컨벤션이고, 구글이나 서버분야는 g_를붙인다고 하드라. 회사마다 다르겠지뭐. 메모리 할당한계치도 전역변수가 더 큼. 스택은 OS가 제한을 타이트하게 잡아서 전역변수보다 배열길이를 조금밖에 못씀. 이게 왜 단점이냐라고 말하면, 난 제한을 많이 걸어둘수록 좋다고생각함. 이건 너도 공감할꺼야.
스택에 있는게 캐시히트 때문에 훨씬 빠름 전역을 쓰는건 귀찮아서 그런거고 유지보수이든 속도이든 될수있는한 전역은 자제하는 습관으로 들이길
전역은 추천하지 않지 유지보수도 어렵고
제한된 메모리가 아닌 이상은 가급적이면 전역 대신 스택 영역(로컬)을 쓰는게 맞음. 문제는 malloc(동적영역인 힙 메모리)인데, 메모리 할당과 해제는 성능 저하의 가장 큰 원인과 불안전을 야기함. 여기서 스태틱(글로벌) 변수를 써서 불필요한 동적할당을 피할 수 있다면 쓰는 것임. 그래야 함수가 호출되거나 반복할 때마다 불필요한 힙영역을 줄일 수 있음
그래서 일부 아카데미 쪽이나 현장에서 c를 안 다루고 배우기만 하는 사람들은 마치 글로벌을 죄악시 하는데. 현장 c 현역 프로그래머 중에 글로벌 안 쓰는 사람 없음. 오히려 힙메모리를 죄악시하고 최대한 피하라고 하지. 글로벌은 필수적으로 써야함