서문
-
책의 서문에서는 코딩이란 예술의 경지이기 때문에 반복해서 사용함으로써 익숙해지고, 좋은 경험을 토대로 새로운 것을 깨닫게 해준다고 나와있다.
-
따라서, 수 많은 이론을 머리에 채워넣었다고 하더라도, 절대적으로 코딩을 해본 경험이 적다면, 반쪽 짜리 프로그래머가 될 수 밖에 없다는 것이다.
-
이론만 배우고 끝나는 것이 아니라, 실제로 코딩을 하면서 손에 익을 때까지 코딩을 해야겠다.
리눅스의 표준 및 역사
- 리눅스가 표준 안을 가지기 전까지, 많은 파생된 버전이 있었다는 것을 알게 되었다.
에일리어싱과 RESTRIC 포인터
-
에일리어싱은 어떤 한 공간에 대해 복수개의 접근 경로가 있는 경우를 의미한다.
-
에일리어싱은 C언어에서, 중요한 역할을 담당하고 있으며, 가독성 향상이나, 형변환을 위해서 사용되지만 때때로, 최적화를 방해하거나, 문제를 일으킬 소지가 있다.
-
몇몇 함수들은 인수로 받아들이는 주소가 에일리어싱 되었을 때 오류를 방지하기 위해 미리 검사하는 행위 때문에 성능 저하가 발생하기도 한다.
-
따라서, 함수 인수가 다른 곳에서 참조하지 않음을 보장해준다면 내부적으로 병렬처리를 하거나, 에일리어싱에 대한 검사를 하지 않아도 되므로 상당히 효율적으로 함수를 설계할 수 있고 이를 위해서
restrict
포인터가 도입되었다. -
restrict
포인터는restrict
포인터가 가리키는 객체를 다른 공간에서 에일리어싱 하지 않도록 강제를 한다.
void *memcpy(void *dest, const void *src, size_t n);
void *memcpy(void *restrict s1, const void *restrict s2, size_t n);
-
위의 코드에서, 상위에 있는
memcpy
함수는 과거에 사용되던 함수의 원형이고, 아래쪽memcpy
는 C99 이후에, 적용되는 함수의 원형이다. -
새롭게 적용된
memcpy
에서는 사용자가s1
,s2
의 접근이 비순차, 비동기적으로 진행되거나 병렬처리 될 수도 있음을 암시하는 것이다.
int *p_num, *p_alias;
p_num = (int *) malloc(sizeof(int) * 100);
p_alias = p_num + 20; /* 에일리어싱 되었음 */
memcpy(p_num, p_alias, sizeof(int) * 50);
-
위의 코드에서
p_num
,p_alias
는 에일리어싱 되었으므로,restict
포인터 룰을 위반한 상태이다. -
따라서 사이드 이펙트의 발생 가능성이 있다.