20.08.15 18:04 작성
·
293
3
1. 정적 멤버 변수는 class 내에서 초기화가 불가능한 이유를 아무리 찾아봐도 const를 붙여서 초기화 하는 방법 밖에 없던데 왜 그런지 이유가 궁금합니다.
2. 5:22초 에서 정적 변수는 main 함수 내에서 직접 접근 할 수 있는게 클래스 내부에서 정적 변수를 선언하고 프로그램을 실행할 때 객체가 생성되지 않아도 정적 변수는 메모리에 올라가 있기 떄문에 직접 접근 할 수 있는 건가요?
답변 7
2
2020. 08. 18. 16:57
답변 감사합니다. 올려주신 그 링크도 보고 https://stackoverflow.com/questions/18749071/why-does-a-static-data-member-need-to-be-defined-outside-of-the-class
이 글도 봤습니다. 종합하자면 class는 주로 헤더 파일에서 작성되고 #include 를 통해 cpp(소스파일)과 만나 obj(오브젝트 파일)을 형성하고 여러 오브젝트 파일들이 링킹됩니다.
이 과정에서 complicated linker rules이라는 것을 피하기 위해 하나의 객체는 단 하나의 특별한 정의를 가지고 있어야 합니다. 더 찾아보니 이걸 ODR(One Defenition Rule)이라고 하는 것 같네요.
하지만 static variable을 class 내부에서 초기화 할 수 있게 만들어 준다면 여러 cpp(소스파일)과 만나면서 복사되는 중에 static variable이 여러번 정의되는 문제가 발생합니다. 앞에서 말했던 규칙이 깨지는 결과가 발생합니다.
그래서 static variable은 class내부에서 초기화가 안되는지 알겠는데 왜 static const variable은 class 내부에서 초기화가 되는지 의문이 들어서 찾아본 결과는 static const variable은 memory에 할당되지 않고 inline된다는데 이건 무슨 말인지 잘 모르겠습니다.
추가로 c++17에서는 inline 을 통해 class내부에서 초기화가 가능하다고 하네요
2
2020. 08. 17. 16:52
제가 그 글을 봐도 잘 모르겠어서 더 찾아 봤는데 클래스 내부에서 정적변수 선언을 하면
다른 객체들이 그 변수를 복사 해서 쓰는 것이 아니라 선언된 정적변수를 나눠쓴다고 합니다.
그로인해 클래스 내부에서 정적변수를 초기화한다면 객체가 생성될 때 마다 정적변수의 값은 바뀌게 되고
그 바뀐값이 다른 객체에게도 영향을 주기 때문에 cosnt static으로 초기화 하거나 따로 클래스 외부에서 초기화를
하게 만들어 주는 것이라고 생각하는데 제 생각이 맞는지 틀린지 모르겠습니다.
2
안녕하세요?
이 글이 두 질문에 대해서 도움이 될 수 있을 것 같습니다. https://stackoverflow.com/questions/9656941/why-cant-i-initialize-non-const-static-member-or-static-array-in-class
1
예를들어 symbol의 경우 symbol in computer science와 같은 넓은 범위도 좋지만 문맥상 compiler와 관련이 있겠구나... 추측할 수 있으니 symbol in compiler 이런 식으로 검색을 해보세요. 앞으로 만나실 모르는 개념들의 정의들도 이와 같이 해결하셨으면 좋겠습니다. 제가 보기에는 가능하실 것 같군요.
substituted...는 좀 더 생각해보시면 좋겠네요.
두 내용은 assembly와 직접적으로 관련은 없고, compile을 하고 난 결과가 assembly로 나타나므로 그 결과를 볼 수 있을 뿐입니다.
1
2020. 08. 20. 04:50
제 질문에 답변을 계속해주셔서 감사합니다. 그 글에서 emit a symbol과 substituted immediately in the code라는 문구가 제가 이해가 안되서 찾아보았지만 혹시 이것이 어셈블리어와 관련 있는 것인가요?
1
이번에 질문하신 것도 제가 처음 올려드렸던 답변의 링크의 네번째 답변에서 역시 확인하실 수 있습니다.
const at file scope makes the compiler never emit a symbol... 부분입니다.
다소 읽기 힘드시더라도 읽어나가주셨으면 좋겠네요. inlining 된다는 것은 runtime이 아닌 compile time에 그 값을 그대로 넣어준다는 겁니다. compiler가 최적화를 해주는 부분이며, 나중에 assembly를 조금 배우실 때가 되면 확인해보셨으면 좋겠습니다. 당장도 어렵지 않을 수도 있지만 지금은 다른 부분에 초점을 두시는 편이 좋지 않을까 생각되는군요.
1
합리적인 생각이라고도 생각하지만 그런 이유는 아닙니다. https://www.stroustrup.com/bs_faq2.html#in-class
이 글을 읽어보셨으면 좋겠습니다. 제가 앞서 달아드린 링크에 첫번째 답변에 있는 링크이고, 네번째 답변이 디테일을 설명해주고 있습니다.