일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 네트워크
- Algorithm
- 자바
- redis
- 백준
- spring webflux
- Galera Cluster
- OS
- 자료구조
- mongoDB
- Kafka
- Data Structure
- Proxy
- Spring
- design pattern
- IT
- Heap
- 파이썬
- 디자인 패턴
- MySQL
- JavaScript
- JPA
- 컴퓨터구조
- C
- MSA
- Java
- 알고리즘
- c언어
- 운영체제
- react
Archives
- Today
- Total
시냅스
C언어 restrict 포인터, static 키워드 본문
restrict 포인터
메모리 접근에 관한 최적화 기능.
Alias rule (메모리 상 같은 위치를 다른 변수로 나타낼 수 있는 규칙)에 부합하지 않는
명확한 상황이라고 판단되었을 때 메모리 위치를 확인하는 과정을 생략한다.
즉, restrict 키워드가 쓰여졌다면 각 변수가 같은 메모리 공간이 아니라는 것을 컴파일러에게 알려주는 것.
restrict 키워드를 쓰기 이전
void increase(int *a, int *b, int *x)
{
*a += *x; // x를 역참조하여 가져온 값만큼 *a를 역참조하여 값을 증가시킴
*b += *x; // x를 역참조하여 가져온 값만큼 *b를 역참조하여 값을 증가시킴
}
아래와 같이 어셈블리어로 확인할 수 있다.
restrict 키워드는 c99 표준으로 -std=c99 Flag가 필요하다.
$ gcc -g -std=c99 -O3 -c increase.c
$ objdump -S increase.o
만약 인자를 아래와 같이 전달했다면,
int a = 1;
increase(&a, &a, &a); // &a, &a, &a는 같은 공간을 가리킴
void increase(int *a, int *b, int *x)
{
*a += *x; // 1 + 1
0: 8b 02 mov (%rdx),%eax // x를 역참조하여 가져온 값을 eax에 저장
2: 01 07 add %eax,(%rdi) // eax의 값만큼 a를 역참조하여 값을 증가시킴
*b += *x; // 2 + 2
4: 8b 02 mov (%rdx),%eax // x를 역참조하여 가져온 값을 eax에 저장
6: 01 06 add %eax,(%rsi) // eax의 값만큼 b를 역참조하여 값을 증가시킴
8: c3 retq
// 연사의 결과 값은 4가 된다.
}
restrict 키워드를 쓴 이후
void increase(int *restrict a, int *restrict b, int *restrict x)
{
*a += *x;
*b += *x;
}
int a = 1;
int b = 1;
int x = 1;
increase(&a, &b, &x); // &a, &b, &x는 다른 공간을 가리킴
// increase(&a, &a, &a);
// 위 주석의 경우에도, 컴파일러는 a가 다른 위치에 있는 것으로 판단하고
// 메모리 주소를 확인하지 않아 연산의 결과값이 3으로 동일하다. 따라서 사용에 주의해야 한다.
인자를 위와 같이 전달한 후,
void increase(int *restrict a, int *restrict b, int *restrict x)
{
*a += *x;
0: 8b 02 mov (%rdx),%eax
2: 01 07 add %eax,(%rdi)
*b += *x;
4: 01 06 add %eax,(%rsi)
6: c3 retq
// 결과값은 3이 된다.
}
쓰기 이전과 비교한다면, 메모리 값을 확인하는 코드의 1줄이 줄어든 것을 확인할 수 있다.
static
- static (정적 전역 변수)변수는 자신이 선언된 소스 파일 안에서만 사용이 가능하다.
- static 변수는 프로그램이 시작될 때 생성되고, 프로그램이 종료될 때 사라진다.
- static 변수는 메모리의 data 영역에서 전역변수와 함께 관리된다.
- static 변수는 초기화를 하지 않아도 0으로 초기화된다.
- static 변수는 매개변수로 사용할 수 없다.
- static 변수는 외부에서 가져다 쓸 수 없다.
- 전역 변수에 static을 붙이면 변수의 범위를 파일 내로 제한하는 효과를 낸다.
'C' 카테고리의 다른 글
C언어 fd : 파일 디스크립터 (File Descriptor) (0) | 2022.03.26 |
---|---|
C언어 Struct : 구조체, 구조체 포인터, 구조체 메모리 (0) | 2022.03.20 |
Makefile : 컴파일을 쉽게 하자! (0) | 2022.03.10 |
C언어 파일 모드 정리 (0) | 2022.01.01 |
C언어 string 관련 함수 정리 (0) | 2021.12.29 |
Comments