프로그램의 경우 http://bellard.org/mersenne.html에서 GCC는 ~ 130MB 실행 파일을 생성합니다. 왜?GCC는 메르 센 프로그램에 대해 매우 큰 실행 파일을 출력합니다.
6
A
답변
12
t[1<<25]={2}
을 t[1<<25]
으로 변경하고 * 실행 파일 **의 크기가 7.3 K으로 떨어집니다. (말할 필요도없이 올바른 결과를 얻지 못할 수도 있습니다)
단지 t[1<<25]
이라면 전혀 공간을 차지하지 않았을 것입니다. 여기
캐치 배열 (제 1 요소 = 2, 다음 2^25-1 요소 모두 0)으로 초기화되고, 그리고이 초기화되기 때문에 글로벌 어레이 데이터 세그먼트 만을 배치 도착이다.
2 버전에 대한 어셈블리를 생성하고 그 차이를 조사하는 것은 만드는 것이 훨씬 더 분명 우리가 알 수 있듯이, 원래 버전에서, 어셈블러는 2^27 (134,217,728) 바이트를 생성하도록 지시한다
[[email protected] ~]$ diff without_mem.s with_mem.s
15c15,21
< .comm t,134217728,32
---
> .globl t
> .align 32
> .type t, @object
> .size t, 134217728
> t: ***<- HERE!***
> .long 2
> .zero 134217724
데이터 세그먼트. 따라서 객체 파일 자체의 일부가됩니다. (-S
스위치로 컴파일하여 어셈블리를 생성 할 수 있습니다. gcc -S -fverbose-asm t1.c
왜 129 MB입니까?
1<< n= 2^n (1 left shifted n times). => 1<<25=2^25. now 1 Integer= 4 bytes =2^2 bytes => 2^25 Integers=2^27 bytes=2^7 * 1 M bytes= 128 MBs
자세한 내용은 다음을 참조하십시오
* 주 1 : 그것은 엄격한 측면에서 object file입니다.
주 2 : 주석에서 지적했듯이 실행 파일이 7.3K 인 경우에도 프로세스 (실행중인 프로그램)의 전체 크기는 129MB가됩니다. (프로그램이 실행되기 시작하면 메모리가 할당됩니다.) top
명령을 사용하여 프로그램의 메모리 사용을 확인할 수 있습니다.
주 3 : t가 전역이므로이 값만 유지되는 것이 중요합니다. 함수의 로컬 데이터 할당은 스택에서 런타임에 계속 발생합니다. 따라서 t
이 로컬 인 경우 객체 파일은 7.3K 만 사용했을 것입니다.
참고 4 : 초기화 된 전역 변수와 마찬가지로 static
초기화 된 로컬 변수는 data
세그먼트에도 보관됩니다. A static
글로벌은 과 같음은 변수의 범위를 현재 파일로만 제한한다는 점을 제외하면 전역 변수와 같습니다.
관련 문제
- 1. 자바 메르 센 국무 할당
- 2. GCC는 공유 라이브러리를 원할 때 실행 가능한 ELF 파일을 출력합니다.
- 3. 메르 센 트위스터 : 시딩 및 시각화
- 4. 메르 센 트위스터를 사용한 C의 난수 생성
- 5. 메르 센 트위스터 씨드는 효과가 없습니다.
- 6. 매우 큰 폴더의 파일을 필터링하십시오.
- 7. 스레드 안전 메르 센 트위스터 나는 저자가 스레드 안전 경우라고 메르 센 트위스터 생성기 클래스 발견 스레드 안전 랜덤 생성기를 찾고
- 8. GCC는 명령 파일을 지원합니까?
- 9. gcc는 as, ld 및 다른 binutils 실행 파일을 어떻게 찾습니까?
- 10. 매우 큰 텍스트 파일을 분할하는 vbscript
- 11. 매우 짧은 시간에 매우 큰 (~ TByte) 파일을 연결하십시오.
- 12. 총 RAM이 매우 낮은 경우 매우 큰 파일을 정렬하는 방법
- 13. 특정 형태의 매우 큰 정수에 대한 소수 증명 알고리즘
- 14. 매우 큰 파일의 XOR
- 15. 임의성에 대한 메르 센 트위스터 알고리즘의 안정적인 목표 -C 구현이 있습니까?
- 16. 매우 큰 .mat 파일
- 17. 매우 큰 목록을 직렬화
- 18. Cygwin에서 GCC는 '출구'에 대해 불평 IDE에 실패
- 19. cmake & gcc는 매번 모든 파일을 컴파일합니다.
- 20. 큰 파일 또는 매우 큰 파일이있는 Resharper
- 21. Microsoft SQL Server 2008에서 매우 큰 SQL 파일 실행
- 22. GCC는 10
- 23. 매우 큰 목록에 합류
- 24. 매우 큰 BigIntegers 인쇄
- 25. 매우 큰 숫자의 vb.net
- 26. 레일 매우 큰 테이블
- 27. prefuse에 매우 큰 파일로드
- 28. 은 매우 큰 문자열을
- 29. 매우 큰 숫자 표시
- 30. 이맥스에서 매우 큰 파일 열기
이 배열 t [1 << 25]는 약 129MB의 메모리를 차지합니다. – Mithrandir