C 의 빈 클래스 가 왜 한 바이트 를 차지 합 니까?
4747 단어 프로 그래 밍 언어메모리 분석
#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 의 내용 의 메모리 크기 를 결정 한 다 는 것 이다.
이 과정 에서 컴 파일 러 는 다음 과 같은 규칙 이 있다.
넓히다
공간 을 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 개의 바이트 메모 리 를 신청 할 것 을 보증 합 니 다. 마침 본 고 에서 연구 한 내용 과 대응 하 는 것 이 신기 하지 않 습 니까?
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
셸 스 크 립 트 프로 그래 밍: sed 명령 으로 텍스트 편집red 는 온라인 편집기 의 일종 이다.그것 은 한 줄 의 내용 을 한꺼번에 처리한다.작업 중 에 한 고객 의 요 구 를 만 났 습 니 다. 기본 와 이 파이 의 ssid 이름 은 MAC 주소 의 뒷 6 자 리 를 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.