주의 : 소설아님
C++17에는 기본적으로 2개의 에러가 추가될 예정이야.
하나는 mvalue참조 에러(간단하게 C4848)이고 다른 하나는 문법 참조에러(C6253)이다
C4848과 C6253은 C++17에 대한 코드의 문법이 너무 정확할 경우나 mvalue를 잘못사용할 때 내던져질 거야.
이게 뭔 개소리냐면 C++자체의 코드들은 처음부터 매우 불안정했던 상태로 나왔지만 컴파일러들이 패치되면서 그것들이 바뀌게 되었지?
그러면서 컴파일러가 무조건 정확한 문법만을 요구하도록, 즉 정확한 문법이 나오게끔 오류를 내보낼 것이란 말이야.
그러면 컴파일러가 C++14에도 견디기 힘들어서 200mb정도의 큰 코드는 저리 던져 버리게되.
여기서가 문제의 핵심인데, 컴파일러는 기본적으로 tree라는 구조를 가지고 있다는 것을 알거야.
tree중에서 가장많이 쓰이는게 이진트리인데 이진트리는 이진수를 쓰는 컴퓨터에게 매우 유리하지.
하지만 여기에 큰 결함중 하나가 tree의 대한 포인터인데, tree가 포인팅 당하는 동안 C++17의 포인터 관련 명령들이 이상 작동을 일으킬거야.
또 무슨 소리인지 모르겠지? 그냥 계속 들어보삼.
C++11의 포인터에서 핵심은 &가 아닌 &&가 추가되었다는 거야. 이것은 메모리에 올라오지 않은 임의의 포인터, 즉 컴파일러의 데이터영역에 임시 저장이 된단 말이야. 그러면 컴파일러는 자기 주소에 저장된 rvalue를 가지고와서 asm사이에 껴주면 되는 거야.
하지만 여기까지는 문제가 없어. C++17에 새로 추가되는 것중에 mvalue참조라는 것이 있는데 이것은 매우 유용하게 쓰일 수 있는 가상메모리 가상포인터야. 이게 뭐냐면 프로세스는 일단 가상메모리에 로드가 되고, 가상메모리의 코딩영역은 전부 read로 바뀌게 되지.
하지만 가상메모리 가상포인터는 read위에 존재하는 포인터로, read가 되어있든 않되어있는 모두 가져올수 있는 형태를 가지게되.
사실 이 기능은 리모트쓰레드로는 실행 시킬 수 없어. 하지만 컴파일러가 문제가 되지.
컴파일러가 자료값을 가리키는 포인터는 가상메모리 가상메모리 동적할당 영역이야. 즉, 문자, 리터럴, 숫자, 문자 등등등을각각의 테이블에 집어넣는데, 이게 너무 정확하게 들어가면 mvalue참조 포인터로 인해 컴파일러가 꼬여버려. 또한 컴파일러의 테이블들이 꼬여버리면 이상한 값들을 마구잡이로 집어 넣겠지.
이게 문제가 되냐고? 아니야. 컴파일러는 문법을 맞추고, 오류를 출력하는 장치일 뿐이지. 아니 그것보다는 더 많은 일을 하겠지만.
하지만 링커에게 문제가 떠넘겨져.
링커는 컴파일러와 직접적으로 연결되어있지는 않지만, 링커가 출력할 오류가 목록에 없을 경우 대신 컴파일러의 오류 목록을 참고하게 되는데, 이때 생기는 오류가 mvalue참조 에러야. 참고로 여기나와있는 소리는 다 개소리니깐 열심히 읽은 사람은 머리속에서 지워버리는게 좋아. 하지만 가상메모리 위에서 참조한다는 개념은 실제로 windows해킹을 할 때 극히 가끔 이용될 수 있어. 유저메모리나 커널메모리나 접근하는 것은 API에 유지하지만, 메모리 해킹은 하드웨어를 해킹해서 직접 값을 가져오거든.
글설리1
글설리2
글설리3
글설리4
글설리5
글설리6
c++ 17이라
개소리를 무척 진지하게 하는거 보니 정말 개인듯
어려운 얘기를 쉽게 잘 정리해서 써주셨네요. 덕분에 재밌게 읽었습니다. 이제 머리속에서 지우도록 하겠습니다 ㅋㅋㅋ