이 코드는 문제가 있는데
b[i]에 값을 쓸 때마다 b[i]의 주소를 계산한다는 거임
뻔하게 고정되어 있는 값인데 말야
왜 그러는 걸까? ㅎ
그리고 어떻게 고쳐야 할까?
b[i] 포인터 주소 참조라 그런가 double *c = b[i] 를 해야되나 - return 0;
답은 인강 다 보고 올려 dream. 제목 그대로 메모리랑 관련된 내용임
츄럴//됬->됐 (되어 = 돼임) [리듬 맞춤법 봇♬]
어셈코드를 설명하자면 1. b[i]의 주소를 계산해서 그 주소의 메모리 값을 부동소수점 레지스터에 저장하고 ( 즉 double tmp = b[i]; )
2. 부동소수점 레지스터에 필요한 만큼의 값을 더하고 ( tmp += a[i*n + j]; )
3. 다시 메모리 b[i]의 주소를 계산한 다음 그 주소의 메모리에 부동소수점 레지스터에 저장됬던 값을 적기( b[i] = tmp )
첫번째 for문에 register double* tmp =b+i; *tmp = 0; 으로 하고 두번째 for문에 *tmp += a[i*n + j]; 하면 될거 같은데
그보다 컴파일 할때 최적화 안되나
핵심은 컴파일러가 왜 최적화를 하지 않느냐는 거임
ㄴ 컴파일러에 따라선 충분히 최적화 시킬거 같은데?
그리고 어떻게 고쳐야 할까?
b[i] 포인터 주소 참조라 그런가 double *c = b[i] 를 해야되나 - return 0;
답은 인강 다 보고 올려 dream. 제목 그대로 메모리랑 관련된 내용임
츄럴//됬->됐 (되어 = 돼임) [리듬 맞춤법 봇♬]
어셈코드를 설명하자면 1. b[i]의 주소를 계산해서 그 주소의 메모리 값을 부동소수점 레지스터에 저장하고 ( 즉 double tmp = b[i]; )
2. 부동소수점 레지스터에 필요한 만큼의 값을 더하고 ( tmp += a[i*n + j]; )
3. 다시 메모리 b[i]의 주소를 계산한 다음 그 주소의 메모리에 부동소수점 레지스터에 저장됬던 값을 적기( b[i] = tmp )
첫번째 for문에 register double* tmp =b+i; *tmp = 0; 으로 하고 두번째 for문에 *tmp += a[i*n + j]; 하면 될거 같은데
그보다 컴파일 할때 최적화 안되나
핵심은 컴파일러가 왜 최적화를 하지 않느냐는 거임
ㄴ 컴파일러에 따라선 충분히 최적화 시킬거 같은데?