Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Algospot
- dfs
- udemy
- 따라하며 배우는 C언어
- BOJ
- BASIC
- server
- DP
- 인프런
- C언어
- greedy
- String
- BFS
- web
- Python
- Cleancode
- 백준
- programmers
- C
- 정수론
- Math
- php
- 생활코딩
- 따배씨
- JavaScript
- graph
- 종만북
- 따라하면서 배우는 C언어
- sorting
- Algorithm
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 12.18 자료형 한정자들 const, volatile, restrict 본문
따배씨 - 따라하며 배우는 C언어
12강 Storage Classes, Linkage and Memory Management
12.18 자료형 한정자 Type Qualifiers 들 const, volatile, restrict
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
/*
Qualified types
const, volatile, restrict, _Atomic
*/
/*
const
*/
const const const int n = 6; // const int n = 6;
typedef const int zip;
const zip q = 8; // const const in zip
//const int i; // NOT Initialized!
//i = 12; // Error
//printf("%n", i); // Error
const int j = 123;
const int arr[] = {1, 2, 3};
return 0;
}
const const const int n = 6;
- const 여러번 사용 가능
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
/*
Qualified types
const, volatile, restrict, _Atomic
*/
/*
const
*/
float f1 = 3.14, f2 = 1.2f;
const float* pf1 = &f1;
//*pf1 = 5.0f; // Error
pf1 = &f2;
printf("%f %p\n", f1, &f1);
// 3.140000 0x7ffeefbff438
printf("%f %p\n", f2, &f2);
// 1.200000 0x7ffeefbff434
printf("%f %p\n", *pf1, pf1);
// 1.200000 0x7ffeefbff434
return 0;
}
const float* pf1 = &f1;
//*pf1 = 5.0f; // Error, Read-only variable is not assignable
pf1 = &f2;
- pf1 에 대입되는 주소값은 변경 가능하지만, 메모리 주소에 저장되어 있는 값은 변경 불가
float* const pf1 = &f1;
pf1 = &f2; // Error, Cannot assign to variable 'pf1' with const-qualified type 'float *const'
const float* const pf1 = &f1;
//pf1 = &f2; // Error, Cannot assign to variable 'pf1' with const-qualified type 'const float *const'
// global constnt file - constants.h
const double gravity = 9.8;
const double PI = 3.141592;
// main.c
#include "constants.h"
int main(){
/*
Global constants
*/
double area_circle = PI * 2.0f * 2.0f;
return 0;
}
- global constant 의 사용은 header 를 만들어 사용하는것이 좋음
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
/*
volatile
- Do not optimize
- (ex: hardward clock)
*/
volatile int vi = 1; // volatile location
volatile int* pvi = &vi; // points to a volatile location
int i1 = vi;
// 무언가 외부에서 vi 값을 변경시키는 코드
int i2 = vi;
return 0;
}
int i1 = vi;
// 무언가 외부에서 vi 값을 변경시키는 코드
int i2 = vi;
- compiler 가 모르게 값이 변경되면, compiler 의 최적화에 의해 원하지 않은 결과가 발생 할 수 있음
- compiler 는 자주 사용되는 vi 를 최적화 하려고 하기 때문
- volatile : 컴파일러가 모르는 상황에서 변수의 값이 변경 될 수 있는 것을 선언
- 컴파일러가 cacing 최적화 하는것을 방지, embadded programing 에서 주로 사용
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
/*
restirct (_restrict in VS)
- sole initial means of accessing a data obejct
- compiler can't check this restriction
*/
int ar[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int* par = ar;
ar[0] += 3;
par[0] += 5;
// par[0] += 8;
int* restrict restar = (int*)malloc(10 * sizeof(int));
if (!restar) exit(1);
restar[0] += 3;
restar[0] += 5;
//restar[0] += 8; // Equalivalent
return 0;
}
int ar[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int* par = ar;
ar[0] += 3;
par[0] += 5;
// par[0] += 8;
- compiler는 같은 주소값에 대한 연산을 한번에 처리( +3 +5 == +8) 하는것이 효율적이지만 다른 표현으로 연산을하기 때문에 한번에 처리하지 못함
int* restrict restar = (int*)malloc(10 * sizeof(int));
if (!restar) exit(1);
restar[0] += 3;
restar[0] += 5;
//restar[0] += 8; // Equalivalent
- restrict 로 선언시, 다른 표현으로의 접근을 방지하기 때문에 compiler 가 연산을 한번에 처리하는 최적화를 해 줄수 있음
- complier 의 최적화를 도와줌
- 하지만, compiler 는 정말로 한가지 표현만으로 접근하는지는 알 수 없음
- 프로그래머가 인지해야 함
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 13.1 파일 입출력의 작동 원리 (0) | 2021.06.16 |
---|---|
[따배씨] 12.19 멀티 쓰레딩 (0) | 2021.06.15 |
[따배씨] 12.17 동적 할당 메모리와 저장 공간 분류 (0) | 2021.06.15 |
[따배씨] 12.16 calloc(), realloc() (0) | 2021.06.15 |
[따배씨] 12.15 동적 할당 메모리를 배열처럼 사용하기 (0) | 2021.06.15 |
Comments