일단 C# 기준으로 묻는건데,
아래 주석대로의 영역에 생성되는거 맞나요?
class testClass {
int a; // 스택
string b = "a"; // 스택+기타?
int[] c = new int[30]; // 힙
public void function(){
int a; // 스택
string b = "a"; // 스택+기타?
int[] c = new int[30]; // 힙
}
}
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
int a; // 스택
string b = "a"; // 스택+기타?
int[] c = new int[30]; // 힙
private void Form1_Load(object sender, EventArgs e) {
testClass TT = new testClass(); // 힙
int a; // 스택
string b = "a"; // 스택+기타?
int[] c = new int[30]; // 힙
}
위 구문은 기본적으로 생성되는 메인구문인데,
저 위치에 선언하면 static으로 취급되나여? 아니면 그냥 첫번째 예시와 같이 스택기준이 되나여?
아, 그리고 스택이 좋은건
CPU L1~L3 캐시에 잘 들어가서 그런거 맞죠?
그거 빼면 똑같고?
C#이라서 답해주는 사람이 적을 거 같다 C++츙들은 많은데
자바 프리미티브에 대응하는 건 스택+힙 나머지는 전부 힙
다만 스택은 말그대로 스택인데 동적할당은 훨씬 더 복잡한 자료구조로 메모리 공간을 관리함. 그래서 그 자료구조 유지하는 거 자체에 시간이 들어가고 뭐 캐시에 올라갈 확률도 낮고 그럼
그럼 C++이라고 하면, 클래스 멤버변수나 그 속에 있는 함수의 지역변수나 다 스택 맞나여?
내 댓글은 읽지도 않노
안 읽었다기 보다는 자바 몰라서 프리미티브가 뭘 말하는건지 인식을 못했음.
(C++ 덕후들이 오기를 기다리는 게시글입니다)
primitive는 언어가 기본제공하는 int double 그런 자료형이고 즈아바랑 상관없읍니다 고갱님
정수형, 불리언형, 실수형, 문자형, 열거형 아니면 무조건 힙이라고
근데 이런 건 언어따라 컴파일러따라 구현따라 최적화 따라 다 다를 거 같은데 아닐수도 있고... C#이나 C++ 언어 덕후가 출동하길 액션빔
나는 메모리 최소 3영역 구분으로 알고 있는데, 스택,힙,데이타. 데이타가 static이나 전역변수 들어가는 데잖아. 전역변수 쓰지말라는게 버그가 가장 큰거긴 하지만, 데이터영역이 스택보다 느리기 때문이기도 한거 아님? 그래서 static처리 되는지 궁금해서 그런거임.
아마 앞부분은 스택,힙 표시한거 다 맞을건데, 뒤쪽에 static class Program {}에서의 멤버변수는 스택인지 데이터인지 확신을 못하겠음. 그리고 static function(){}인 경우의 지역변수도 확신을 못하겠고...
근데 스택보다 데이터가 더 느린거 맞긴함? 그것도 잘 모르겠음. ㅠㅠ
검색하면서 눈팅중인데, 위에 말한 "a"라는 텍스트는 "코드영역(text)"에 들어가는거구나. 이런건 또 첨 알았네. 난 감으로 힙이나 데이타 영역인 줄 알았는데...
가상메모리 겅부하세요
아, static class Program {} 멤버는 애초에 static 아니면 선언 못하는구나. 에러 안띄워줘서 몰랐네.
스택 힙을 C#으로 공부하는 것만큼 미련한게 있을까 - return 0;
좀 잘못이해하고 있는디 몇개만 말하면 맨위부터 a는 클래스 맴버니깐 인스턴스 만둘어질때 힙에올라감 b는 참조타입이고 역시 클래스 맴버라 힙에생기고 "a"란 문자열은 뮨저열 풀 (보통은 데이터/자바는 힙에 permGen이라는데 생긴다던데 이건 찾아보셈)에 생김 c는 자체는 힙이고 30개의 인트는 힙에생김
c#에서 클래스는 무조건 참조타입이라 실제 객체는 항상 힙에올라감 MyClass a=new MyClass()에서 a는 스택일수도있고 힙일수도있고 데이터일수도있음