하스켈이나 오캐믈 같은 경우 배열을 파라미터로 넘기고 뭐
(update dpList i j val)이런식으로 업데이트 할텐데, 얘네는 기본이 immutable이라 저런식으로 업데이트해도 메모리 손해 안본다 (배열을 처음부터 복사하는게 아니라는 말)
익명(70.55)2022-04-24 12:45
답글
immutable이면 배열 수정하려면 오히려 새로 만들어야 되는거 아님?
익명(112.153)2022-04-24 12:48
답글
디폴트가 immutable이기 때문에
cons = \x : T -> \l : List T -> List T라고 함수가 있어
cons x [y,...] = [x,y,...]
라는 결과가 나왔을 때
컴파일러 레벨에선 (cons x [y,..,]) 포인터만 업데이트 해주면 됨
dp 배열을 파라미터로 넘기면 되지 ㅇㅅㅇ
아
근데 그러면 사이드 이펙트가 생기는거 아님?
복사해서 넘기자늠
결국 함수 외부에 있는 dp배열을 못건드리면 dp 쓰는 의미가 없지 않음?
그리고 배열은 대부분 call by reference잖아
어차피 dp배열이 함수를 통과해서 갱신되면 다시 들어갈땐 다른 인풋인데 뭐가 문제노
외부의 DP를 왜 만드냐니까 ㅇㅅㅇ DP는 외부에 있어야한다 그런 제약조건 없음
ㅇㅎ 미리 저장된 값이라는데서 전역변수로 둬야하는 선입견이 있었음
*한다는
하스켈이나 오캐믈 같은 경우 배열을 파라미터로 넘기고 뭐 (update dpList i j val)이런식으로 업데이트 할텐데, 얘네는 기본이 immutable이라 저런식으로 업데이트해도 메모리 손해 안본다 (배열을 처음부터 복사하는게 아니라는 말)
immutable이면 배열 수정하려면 오히려 새로 만들어야 되는거 아님?
디폴트가 immutable이기 때문에 cons = \x : T -> \l : List T -> List T라고 함수가 있어 cons x [y,...] = [x,y,...] 라는 결과가 나왔을 때 컴파일러 레벨에선 (cons x [y,..,]) 포인터만 업데이트 해주면 됨
그리고 immutable이기때문에 gc처리할때 쓸 수 이ㅛ는 테크닉이 있음
https://wiki.haskell.org/GHC/Memory_Management
https://stackoverflow.com/questions/4522304/does-functional-programming-take-up-more-memory
링크 읽어봤는데 그니까 생성된 변수를 직접 사용할 때에만 실제 메모리를 쓴다는 건가?
대충 두 개 링크에서 나온 결과를 종합해보면 1. 많은 함수형 언어/라이브러리들은 lazy evaluation으로 필요할 때만 메모리를 쓰고 2. 많은 메모리가 필요한 경우 빠르게 gc 처리를 해준다. 불변성 때문에 쓸 수 있는 gc 테크닉이 있다
함수형 프로그래밍의 사이드이펙트 억제에 의해 증가하는 메모리 사용량에 대해 언어 자체에서 GC 등의 대책을 가지고 있다는거구만
dpTbl*