C는 데니스리치가 call by value밖에 없다고했고
C++은 다들 알다시피 call by reference가 가능함
그래서 call by pointer 랑 call by reference랑 차이점이 있나해서 검색해봤는데 C++에선 어셈단위에서 같은 동작을 보임
그러면 C의 포인터랑 C++의 포인터랑 어셈단위에서 동작이 다름?
아니면 콜바밸 콜바레는 어셈단위얘기가 아닌거임? 만약 그렇다면 레퍼런스를 넘긴다는 행위(call by reference)는 대체 어떤것임?
포인터가 뭔지부터 생각하셈.
님 제 질문 제대로본거맞음??
어셈단위에서 pointer랑 reference랑 똑같이나온다고함
당연한거아님? call by pointer라는건 존재하지 않음. pointer는 단순히 "특정 메모리 위치"를 가르키는 주소값일 뿐이지. 포인터 자체가 타입이고.
근데 C에서는 그게 call by value고 C++에서는 call by reference라는데?
아예 다른 체계인 두 가지를 비교하는거임
그러면 C랑 C++에서 포인터를 구현하는게 다른거임?
당연히 포인터는 값이지 T& 는 type T에대한 reference고 T*는 T*라는 타입이니까 값이지.
T&에 대한 값은 T랑 같은데 &T에대한 값이 T랑 같음? 포인터가 뭔지부터 생각하라니까 ㅋㅋ
포인터는 특정 메모리에 대한 위치값이고 레퍼런스는 특정 값에 대한 레퍼런스라니까? 다른 체계에 있는 두 가지를 왜 쳐 비교하고있음 ㅋㅋㅋ
그 특정값에 대한 레퍼런스를 결국 주소복사해서 넘기는거아님? 어셈단위에서 똑같은거면
좀 더 검색해보니 포인터는 메모리주소를 보유하는 변수고 레퍼런스는 참조하는 항목과 동일한 메모리주소를 갖는다고함, 근데 어셈레벨에선 똑같은데 결국 개념적인얘기임?
syntax를 가지고 분류하지 거동을 가지고 분류하진 않을거같은데. 글쓴이는 C++ 레퍼런스 쓰는 법을 알음?
ㅇㅇ 기능적인건 암
구문을 알면 대략 감이 잡힐텐데
그럼 단순 구문단위구분임? 결국 메모리나 기계어단에서의 구분이아니라 구문적인것임?
그걸 어셈 까서 보는게 어디 나오는지는 모르겠는데 저거 구분하면서 어셈 까본다는 얘기는 처음 들어봄
스택오버플로에있음
뭔가 바뀌었을거같은데. 구분을 한 다음 어셈을 까보는건 봤어도 저걸 구분하기 위해 어셈을 까본다?
https://stackoverflow.com/questions/19858980/how-does-assembly-do-parameter-passing-by-value-reference-pointer-for-differe
질문자는 이미 구분을 이쁘게 해뒀구만 왜 저기서 새로운 기준으로 만드려고 그럼?
for랑 goto랑 어셈까면 다 점프인데 둘이 똑같은거냐
ㄹㅇ? 그건몰랐네...
근데 레퍼런스도 결국 주소값을 복사해서 넘기는거아님?
그런식으로 간략화하면 모든 프로그램은 그냥 메모리상에 배열된 정보니까 똑같다고도 할수있음 문법상의 차이가 있는건데 그걸 뭉개고 어셈만 보면 당연히 차이가 안보이지
프갤에수 누가 메모리단위에서 다르다고해서 지금 좀 햇갈리는데
근데 C에서 포인터가 콜바밸인이유가 포인터에 주소값을 복사해서 넘기는거잖아, 레퍼런스는 뭐가다른거임
전혀 차이 없음. 타입 레벨 최적화정도의 차이임.
C++에선 레퍼런스의 레퍼런스는 존재할수 없는데 포인터의 포인터는 가능함
그럼 둘이 어셈단위에선 같은동작을 하는데 왜 콜바밸 콜바레로 구분하능거지?? 용어 존나 햇갈리네 시팔
그러면 C도 결국 콜바레라고 해도 되는거아님? 왜 콜바레라고 하면 안됨? 둘다 주소값넘기는 내부동작은 똑같은데
그럼 왜 같은 동작을 하는데 타입있는 언어를 왜 씀? 그냥 어셈블리로 코드 짜셈 병신아
내부동작으로 보면 어셈블리 기계어쓰셈 문법차이가 있다는데도 자꾸 거기 메여있누
문법차이는 알겟는데...그러면 C의 포인터도 콜바레라고 해도 되는거아님?
데니스 리치 씹새끼가 무조건 콜바밸이라고는 했는데 콜바밸 콜바레 용어구분이 너무 불명확함
아니 씨발 포인터는 값이라고 ㅋㅋ 레퍼런스가 아니라 위에 파딱이 좋은 예시를 줫는데 왜 생각해볼생각을 안 함 T&는 T에대한 레퍼런스기때문에 T&의 레퍼런스는 T에대한 레퍼런스고, 그러므로 T&의 레퍼런스는 T&이라는 결과가 나오는데 T*의 포인터는 T*타입의 값에 대한 포인터기때문에 T**가 나오잖아? 그니까 T*는 레퍼런스가 아니라 값이라니까 ㅋㅋㅋ
T*에 접근할때 lvalue reference가 되는거지 빡대가리야 T* v; *v = 10; 이런식으로 접근할때 *v 가 T&가 되는거지
난 빡대가리아님 머리좋은사람임
그럼 씨발 좀 설명해주면 설명을 좀 쳐 듣고 이해를 해
밑에 댓글로 정리해놨으니 그거보고 답해줭 ;ㅅ;
컴퓨터 입장에선 포인터나 값이나 걍 바이트 덩어리라 무조건 복사한다고 말함. 그걸 call by value니 reference니 하는 건 결국 인간의 해석일 뿐임. 막말로, ECS 같은 데서 사용하는 int 타입의 객체 id를 전달해도, 해석할 때는 참조 전달로 해석할 수도 있지.
그니까 정리하면...일단 데니스리치가 C언어는 콜바밸 만 있는 언어라고함, 콜바밸인 이유를 듣자하니 포인터는 주소값을 '복사'해서 넘기는게 그 이유라고함. 근데 레퍼런스도 주소값을 '복사'해서 넘기는 동작임, 결론은 둘다 주소값을 '복사'해서 넘기는데 왜 하나는 콜바밸이고 하나는 콜바레임?
그니까 콜바밸 콜바레를 구분하는기준이 '주소값을 복사해서 넘긴다' 이게 아닌것?
스택오버플로에서는 주소값을 '복사'해서 넘기기때문에 콜바밸이라고 하던데
"복사"라는 용어가 두 가지 의미를 내포하고 있어서 네가 혼동이 온 것 같다.
그런거임? 어떤면에서 혼동했는지 알려주라
위 댓글에 써놨는데
goto랑 for은 카테고리 구분자체가없지않나...저 예시랑은 좀 다른거같아
암튼 이부분이 존나햇갈림, 아직 명쾌하게 이해를못했어
while이랑 for랑 goto랑 같음, 그리고 동시에 3개는 flow control이라는 점에서 같은 구분임. 똑같이 jmp 쓰는데?
일단 님 댓글보면서 다시 생각해보겠음;;
내 말은, 컴터 입장에서는 포인터나 값이나 걍 데이터 덩어리라 무조건 복사한 다는 뜻에서 데니스 양반이 그런 말을 한 거고. 이 데이터 덩어리를 인간이 해석할 때 레퍼런스 밸류로 구분을 한다고. 데니스 양반은 컴터 입장에서 말하는 거고 너는 인간 입장에서 이해하는 거임. ㅇㅋ?
모르겠으면 그냥 받아들이셈 그냥 정의가 그런걸 우짜누?
안됨...이건 넘어갈수가없엉
기계레벨로 가면 전부 value copy인데 그걸 어느 추상화 선에서 잘라서 이거부턴 reference다 라고 한게 끝임. 그래서 그냥 받아들이는거고
병원가보셈 아스퍼거있네 이양반
칭찬 ㄱㅅㄱㅅ 나도 아스퍼거가 되고싶은데...희망이없음, 너무 정상임