몽상실현개발주의

[따배씨] 12.18 자료형 한정자들 const, volatile, restrict 본문

Language/C

[따배씨] 12.18 자료형 한정자들 const, volatile, restrict

migrationArc 2021. 6. 15. 23:30

[따배씨] 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

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

 

Comments