비트 도메인, 링크 표시
비트 도메인
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 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;
} ;
/* 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 언어로 작성된 함수
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++ */
}
중첩
/* 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 언어에 사용되는 함수 생성
/* 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++ . */
}
밑바닥에서 이해 링크 지시 실현
/* 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 ,
* , .
*/
이름 손질
/* 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
/* 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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.