C 의 빈 클래스 가 왜 한 바이트 를 차지 합 니까?

상황 분석
#include 


class A {};

int main(int argc, char *argv[])

{

    printf("%ld
", sizeof(A)); return 0; }

 
리 눅 스 엔 드
 
g + + - S 에서 얻 은 어 셈 블 리 (부분 코드)
 
	.file	"emptyclass.cpp"
	.text
	.section	.rodata
	.type	_ZStL19piecewise_construct, @object
	.size	_ZStL19piecewise_construct, 1
_ZStL19piecewise_construct:
	.zero	1
	.local	_ZStL8__ioinit
	.comm	_ZStL8__ioinit,1,1
.LC0:
	.string	"%ld
" .text .globl main .type main, @function main: .LFB1493: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 subq $16, %rsp movl %edi, -4(%rbp) movq %rsi, -16(%rbp) movl $1, %esi leaq .LC0(%rip), %rdi movl $0, %eax call printf@PLT movl $0, %eax leave .cfi_def_cfa 7, 8 ret .cfi_endproc

g + + - c 에서 얻 은 대상 파일, objdump - ds 를 통 해 보기
0000000000000000 
: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp 8: 89 7d fc mov %edi,-0x4(%rbp) b: 48 89 75 f0 mov %rsi,-0x10(%rbp) f: be 01 00 00 00 mov $0x1,%esi 14: 48 8d 3d 00 00 00 00 lea 0x0(%rip),%rdi # 1b
1b: b8 00 00 00 00 mov $0x0,%eax 20: e8 00 00 00 00 callq 25
25: b8 00 00 00 00 mov $0x0,%eax 2a: c9 leaveq 2b: c3 retq

g + + 실행 가능 한 파일 (동적 링크) 을 받 은 후 objdump - ds 를 통 해 보기
000000000000078a 
: 78a: 55 push %rbp 78b: 48 89 e5 mov %rsp,%rbp 78e: 48 83 ec 10 sub $0x10,%rsp 792: 89 7d fc mov %edi,-0x4(%rbp) 795: 48 89 75 f0 mov %rsi,-0x10(%rbp) 799: be 01 00 00 00 mov $0x1,%esi 79e: 48 8d 3d 00 01 00 00 lea 0x100(%rip),%rdi # 8a5 <_zstl19piecewise_construct> 7a5: b8 00 00 00 00 mov $0x0,%eax 7aa: e8 91 fe ff ff callq 640 7af: b8 00 00 00 00 mov $0x0,%eax 7b4: c9 leaveq 7b5: c3 retq

sizeof (A) 에 있 는 코드 를 알 수 있 습 니 다. 일찍 상수 0x1 로 바 뀌 었 습 니 다.
 
Windows
 
#include 

class A {};
int main(int argc, char *argv[])
{
00AD13C0  push        ebp  
00AD13C1  mov         ebp,esp  
00AD13C3  sub         esp,0C0h  
00AD13C9  push        ebx  
00AD13CA  push        esi  
00AD13CB  push        edi  
00AD13CC  lea         edi,[ebp-0C0h]  
00AD13D2  mov         ecx,30h  
00AD13D7  mov         eax,0CCCCCCCCh  
00AD13DC  rep stos    dword ptr es:[edi]  
	printf("%ld
", sizeof(A)); 00AD13DE mov esi,esp 00AD13E0 push 1 00AD13E2 push 0AD5858h 00AD13E7 call dword ptr ds:[0AD9114h] 00AD13ED add esp,8 00AD13F0 cmp esi,esp 00AD13F2 call __RTC_CheckEsp (0AD1136h) return 0; 00AD13F7 xor eax,eax } 00AD13F9 pop edi 00AD13FA pop esi 00AD13FB pop ebx 00AD13FC add esp,0C0h 00AD1402 cmp ebp,esp 00AD1404 call __RTC_CheckEsp (0AD1136h) 00AD1409 mov esp,ebp 00AD140B pop ebp 00AD140C ret

 
결론.
 
sizeof 는 연산 자 일 뿐 어 셈 블 리 할 때 컴 파일 러 에 의 해 값 으로 대 체 됩 니 다.
컴 파일 러 가 sizeof 의 내용 의 메모리 크기 를 결정 한 다 는 것 이다.
이 과정 에서 컴 파일 러 는 다음 과 같은 규칙 이 있다.
  • 형식 자체 가 메모 리 를 사용 하지 않 고 실례 화 된 대상 이 메모 리 를 사용 합 니 다.그래서 sizeof 의 내용 은 무엇이든 실례 로 이해 해 야 한다
  • 인 스 턴 스 의 메모리 크기 는 적어도 비정 상 구성원 의 크기 를 합 친 것 입 니 다.
  • 컴 파일 러 는 언제 대상 에 게 메모 리 를 추가 로 할당 합 니까?
  • 가상 함수 포인터.
  • 메모리 정렬.CPU 길이 의 정수 배로 데 이 터 를 읽 는 것 이 더 빠 릅 니 다.
  • 빈 stuct, union, class 의 인 스 턴 스 는 최소 1 바이트 입 니 다.C / C + + 표준 은 모두 이와 같다.


  • 넓히다
     
    공간 을 0 으로 차지 하 는 대상 은 그 의미 와 malloc (0) 가 대응 합 니 다.
    크기 가 0 인 대상 을 지원 할 수 있 는 지 없 는 지 는 운영 체제 가 malloc (0) 에 대한 반응 을 보십시오. 어떤 것 은 NULL 로 돌아 가 신청 실 패 를 표시 합 니 다.정상 적 인 것 처럼 보 이 는 지침 을 되 돌려 주 는 경우 도 있 지만, 이 지침 으로 인해 메모리 가 유효 하지 않다.컴 파일 러 와 마찬가지 로 대부분의 운영 라 이브 러 리 는 광범 위 한 이식 성 을 확보 하기 위해 malloc 를 포장 합 니 다. Python 을 예 로 들 면
     
    #define PyMem_MALLOC(n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
    
    : malloc(((n) != 0) ? (n) : 1))
    
    #define PyMem_REALLOC(p, n) ((size_t)(n) > (size_t)PY_SSIZE_T_MAX ? NULL \
    
    : realloc((p), ((n) != 0) ? (n) : 1))
    
    #define PyMem_FREE free

     
    이 는 malloc 호출 에 대해 적어도 1 개의 바이트 메모 리 를 신청 할 것 을 보증 합 니 다. 마침 본 고 에서 연구 한 내용 과 대응 하 는 것 이 신기 하지 않 습 니까?

    좋은 웹페이지 즐겨찾기