비트 도메인, 링크 표시

6384 단어

비트 도메인

  • 비트 필드, 클래스/구조체의 데이터 구성원, 일정한 비트를 수용하는 데 사용..
  • 비트 영역의 정의: 정수 형식 변수 이름: 비트.예:
  • typedef unsigned char Flags;
    class Stream{
        Flags _Error: 1;/* _Error  ,  1 bit. :0/1 */
        Flags _Eof: 1;
    public:
        Flags _Mode: 2;/* _Mode  2bit, :0,1,2,3 */    
    };
  • 정수 유형은 unsigned, 또는signed일 수 있습니다. unsigned 유형으로 권장합니다.signed 유형은 아무런 의미가 없습니다
  • 비트맵의 사용: 클래스나 구조체의 다른 데이터 구성원과 같다

  • 주의하다

  • 주소 찾기 연산자는 비트 영역에 적용할 수 없습니다
  • 비트 영역은 클래스의 정적 데이터 구성원이 될 수 없습니다

  • 메모리 할당

  • 그런 분배 방식이든 비트맵은 구조체와 유사하다. 즉, 먼저 성명한 구성원은 낮은 주소에 있고, 나중에 성명한 구성원은 높은 주소에 있다
  • __attribute__((__gcc_struct__)) 기본 할당 방식입니다
  • 이 때 유형을 구분하지 않고 모든 비트 영역을 통합하고 원래 유형의 최대 크기를 기본 저장소로 합니다
  • 기본 메모리 단위: 컴파일러가 비트 영역에 메모리 공간을 분배할 때의 기본 단위이며, 이러한 비트 영역에 분배된 메모리는 기본 메모리 단위 크기의 정수 배로 증가한다
  • /*  : unsigned short,  sizeof(unsigned short)*8 > 3+7.
     *  .  sizeof(Test)==sizeof(unsigned short);
     *   [0,3)   a,[8,15)   b.
     */
    struct Test{
    	unsigned short a: 3;
    	unsigned char  b: 7;
    }__attribute__((__gcc_struct__))  ;
    
    /*   sizeof(unsigned short)*8 < 3+14;  2  .
     *   sizeof(Test)==2*sizeof(unsigned short).
     *   b  , : [0,3)   a,[16,30)   b.
     */
    struct Test{
    	unsigned short a: 3;
    	unsigned char  b: 14;
    }  ;
  • __attribute__((__packed__))최소 저장 공간 정책, 이때 모든 비트 영역을 통합하고 변수에 대해 단일 바이트 방식으로 정렬합니다
  • /*   3+7=10 bit,  2  (16 bit)  a,b. 
     *   [0,3)   a,[3,10)   b,  a,b  .
     */
    struct Test{
    	unsigned short a: 3;
    	unsigned char  b: 7;
    } __attribute__((__packed__)) ;

    위치 순서


    링크 표시

  • 링크 지시, 다른 프로그램 설계 언어(예를 들어 C 언어)를 사용하여 작성한 함수입니다.또는 다른 언어에서 사용할 수 있는 함수를 생성합니다(함수 자체는 C++로 이루어집니다).다음은 C 언어를 예로 들어 링크 지시의 사용법을 설명합니다.

  • C 언어로 작성된 함수

    extern "C" size_t strlen(const char *);
    extern "C"{
        int strcmp(const char *,const char *);
        char* strcat(char *,const char *);
    }
  • 그 중'{}'의 역할은 링크 지시를 응용한 성명을 집합하는 것일 뿐이다.작용역의 작용을 하지 않는다.즉 이때'{}'내의 함수는'{}'외에서도 볼 수 있다

  • 무거운 짐

    extern "C" int max(int a,int b);
    int max(double a,double b);
    char* max(const char *left,const char *right);
    
    int main(int argc,char *argv[]){
    	int a=3,b=7;
    	max(a,b);	/*   max(int,int)   C   */
    	
    	double ad=3.0,bd=7.0;
    	max(ad,bd);	/*   max(double,double),C++   */
    
    	max("Hello","World");/*   max(const char *,const char *),C++   */
    }
  • 다시 불러오는 집합에는 최대 하나의 C 언어로만 작성할 수 있는 함수가 있고, 다른 함수는 C++로 작성됩니다

  • 중첩

  • 링크 지시는 끼워 넣을 수 있습니다. 이 때 함수 성명은 최근의 링크 지시에 따라 사용됩니다
  • /* funcs.h   */
    extern "C"{
    int strcmp(const char *,const char *);
    int strlen(const char *);
    }
    
    /* funcs.cc   */
    extern "C"{
       #include "funcs.h"
    }
    /*   funcs.cc  : */
    extern "C"{
        extern "C"{
            int strcmp(const char *,const char *); /*  ,  extern "C" */
            int strlen(const char *);/*   */
        }
    }

    C 언어에 사용되는 함수 생성

  • 함수 정의에서 extern "C"를 사용하면 컴파일러가 이 함수에 코드를 생성할 때 그는 C 언어에 적합한 코드를 생성합니다.이렇게 하면 C 언어에서 이 함수를 호출할 수 있다. 예를 들어:
  • /* max.cc */
    extern "C" int max(int a,int b){
        return a>b?a:b;
    }
    /* main.c */
    int main(int argc,char *argv[]){
        max(3,7);/*   max.cc   C++  . */
    }

    밑바닥에서 이해 링크 지시 실현

  • 하나의 모듈이 함수를 호출하려면 링크할 때 현재 모듈이나 다른 모듈에서 이 함수의 정의를 찾아야 합니다.
  • 왜 C 언어로 작성된 함수를 직접 설명할 수 없습니까? 예를 들어:
  • /* main.cc */
    int max(int a,int b);
    extern "C"  int min(int a,int b);
    
    int main(int argc,char *argv[]){
        max(3,7);
        min(3,7);
    }
    /* max.c */
    int max(int a,int b){
        return a>b?a:b;
    }
    /* min.c */
    int min(int a,int b){
        return a>b?b:a;
    }
    /*   g++ -S mian.cc; gcc -S *.c   main.s,max.s,min.s   */
    /* main.s */
    main:
    	pushq	%rbp
    	movq	%rsp, %rbp
    	subq	$16, %rsp
    	movl	%edi, -4(%rbp)
    	movq	%rsi, -16(%rbp)
    	movl	$7, %esi
    	movl	$3, %edi
    	call	_Z3maxii /*   _Z3maxii  ,  _Z3maxii   */
    	movl	$7, %esi
    	movl	$3, %edi
    	call	min /*   min  . */
    	movl	$0, %eax
    	leave
    	ret
    /* min.s */
    min:
    	pushq	%rbp
    	movq	%rsp, %rbp
    	movl	%edi, -4(%rbp)
    	movl	%esi, -8(%rbp)
    	movl	-8(%rbp), %eax
    	cmpl	%eax, -4(%rbp)
    	cmovle	-4(%rbp), %eax
    	popq	%rbp
    	ret
    /* max.s */
    max:
    	pushq	%rbp
    	movq	%rsp, %rbp
    	movl	%edi, -4(%rbp)
    	movl	%esi, -8(%rbp)
    	movl	-4(%rbp), %eax
    	cmpl	%eax, -8(%rbp)
    	cmovge	-8(%rbp), %eax
    	popq	%rbp
    	ret
    /*  ,  min  ,  _Z3maxii  ,
     *  , . 
     */

    이름 손질

  • g++ 컴파일러는 컴파일할 때 원본 파일에 나타나는 모든 함수 이름을 명칭 수식합니다. 언어 특성을 지원하는 데 사용됩니다(예를 들어 함수 재부팅...)
  • gcc컴파일러는 함수 이름을 수식하지 않습니다. 예를 들어:
  • /* max.cc */
    int max(int a,int b){
        return a>b?a:b;
    }
    /* g++ -x 'c++' -S max.c -o max.s */
    _Z3maxii: //   max()   _Z3maxii;
            pushq   %rbp
            movq    %rsp, %rbp
            movl    %edi, -4(%rbp)
            movl    %esi, -8(%rbp)
            movl    -4(%rbp), %eax
            cmpl    -8(%rbp), %eax
            jle     .L2
            movl    -4(%rbp), %eax
            jmp     .L3
    .L2:
            movl    -8(%rbp), %eax
    .L3:
            popq    %rbp
            ret
    /* gcc -S max.c -o cmax.s */
    max: //  
            pushq   %rbp
            movq    %rsp, %rbp
            movl    %edi, -4(%rbp)
            movl    %esi, -8(%rbp)
            movl    -4(%rbp), %eax
            cmpl    %eax, -8(%rbp)
            cmovge  -8(%rbp), %eax    //PS: gcc  ,  g++  ..
            popq    %rbp
            ret
  • extern "C"의 역할: 컴파일러가 같은 이름의 동형참표(즉 매개 변수의 개수, 유형이 모두 같다)의 함수 이름을 다음과 같이 이름 수식하는 것을 금지한다
  • /* main.cc */
    extern "C" int max(int a,int b);//  max(int,int)  .
    int max(int a,int b,int c);
    
    int main(int argc,char *argv[]){
        max(3,7); 
        /*   max(int,int),  max(int,int)   extern "C"  .
         *  .  call _Z3maxii;  call max.
         */
        max(3,7,37);
        /*   max(int,int,int),  extern "C"  .
         *   call _Z3maxiii
         */
    }
    /* g++ -S main.cc,  */
    main:
            pushq   %rbp
            movq    %rsp, %rbp
            subq    $16, %rsp
            movl    %edi, -4(%rbp)
            movq    %rsi, -16(%rbp)
            movl    $7, %esi
            movl    $3, %edi
            call    max
            movl    $37, %edx
            movl    $7, %esi
            movl    $3, %edi
            call    _Z3maxiii
            movl    $0, %eax
            leave
            ret

    좋은 웹페이지 즐겨찾기