우수 답변
> cat pointersize.c
#include
int main(){
int *ip;
printf(“pointer size: \%zu\n”, sizeof(ip));
}
> cc -o pointersize pointersize.c
> ./pointersize
pointer size: 8
> cc -m32 -o pointersize pointersize.c
> ./pointersize
pointer size: 4
포인터 크기는 코드를 컴파일하는 모델에 따라 다릅니다. 운영 체제가 아닙니다. 그래서 저는 64 비트 Linux를 가지고 있지만 gcc가 32 비트 코드를 컴파일하도록 강제하면 4 바이트 포인터 크기로 32 비트 ELF 및 i386 코드를 얻게됩니다.
Windows에서 4 바이트를 얻는다면 이는 당신을 의미합니다. 여전히 32 비트를 컴파일하고 있으며 컴퓨터의 잠재력을 최대한 발휘할 수있는 스위치를 찾아야합니다. Unleash the Kraken!
저는 어제 32 비트 i386 코드와 x86\_64 bdver2 (Piledriver, Haswell 이상)의 성능이 속도 향상에있어 5 배 이상이 될 수 있다는 것을 벤치마킹했습니다. 더 큰 메모리 모델. 대부분의 경우 그다지 중요하지 않습니다. 4GB의 메모리는 대부분의 애플리케이션에 충분합니다.
하지만 32 비트 코드만으로는 MMX, SSE, SSE2,3,4의 기능을 잃기 시작하고 지난 35 년. 모든 데이터 전송, 비트 조작, 문자열 연산, 고급 수학 함수, 그리고 …
경우에 따라 원본 x86 코드가 이점이기는하지만, 그럴 수 없습니다. 코드의 견고 함을 이겨내세요!
편집 : (작은 소리는 무시해도됩니다)
좋습니다. 저는 항상 그런 문장의 가치를 확인합니다. x86\_64와 8086 레거시 코드를 방금 컴파일했습니다. x88\_64의 경우 53 바이트, 작은 프로그램이있는 8086 레거시 코드의 경우 74 바이트입니다. 음… 8/16 비트로 유지하면 사실 일 수 있습니다. 그러나 최신 소프트웨어와 C 프로그램 및 컴파일러에서는 그렇지 않습니다. 따라서 오래된 유산 시대가 사라 졌다는 눈물은 없습니다. 솔직히 말해서 그들은 똥이었습니다. 유일하게 좋은 점은 그때 제가 젊었을 때 반짝 였다는 것입니다. 하지만 다른 단점도있었습니다.
요점은 우리의 최신 프로세서가 정말 멋지다는 것입니다. 우리는 80 년대에 우리가 꿈꾸던 것을 이제 가지고 있습니다. 드디어 1, 2 바이트는 신경 쓰지 않는 하드 드라이브를 충분히 확보했습니다. Windows 나 기타 리소스를 많이 사용하지 않으면 충분한 메모리가 있습니다. 우리는 CPU에서 벡터 처리를하고 GPU에서 총 병렬 컴퓨팅을 수행합니다. 멀티 코어, 수학 FPU, MMX, SSE, SSEx와 같은 특수 레지스터가 있습니다. FMA3 및 FMA4가 있습니다. 마이크로 코드 또는 하드웨어에서 모든 멋진 작업을 수행하는 고도로 정교한 어셈블리 opcode를 얻었습니다. 한 번의 주기로 수행되는 경우가 많았습니다. 80 년대에 감히 꿈꿔 오던 그 어떤 것보다 더 큰 캐시 메모리를 얻었습니다. .
그리고 80 년대에 “다가오는”것은 CD 였고 값싼 은판에 엄청난 기가 바이트를 저장하려는 아이디어는 상상할 수 없었습니다. 그리고 우리는 컴퓨터가 장착 된 전화기를 가지고 있는데, 그것은 속도 등의 요소 10000에 의해 85 년의 가장 큰 메인 프레임 컴퓨터를 시뮬레이션 할 수 있습니다.
이제 우리는 모든 멋진 것들을 가지고 있습니다!
하지만 우리는 그것으로 무엇을하고 있습니까? 우리는 144 문자를 트위터합니다. 더 이상 우리의 새로운 프로세서의 어셈블리 opcode의 경이로움을 아는 사람은 없습니다. 우리는 스팸을 제거하고 Windows 시스템을 구동합니다. Windows 시스템은 제가 공부를 시작했을 때 1985 년에도 “곧 사라졌습니다”, “쓰레기”, “그 쓰레기로 무엇을합니까?”로 평가되었습니다.
그렇지 않았습니다. Windows에서 더 나아지지는 않습니다. 여전히 버그가 많고 멀웨어 스팸 쓰레기입니다. 그것은 우리 컴퓨터 하드웨어의 경이로움을 뒤덮고 있습니다. 너무나 놀랍습니다. 우리 시대에 더 잘 맞는 OS를 설치하면 마음이 멀어 질 것입니다. 특히 개발자로서.
우리 프로세서의 개발 속도는 경쟁자가 두 개 밖에 남지 않은 상태에서 진행되고 있습니다. 이제 우리가 이미 가지고있는 것을 실제로 발휘할 때입니다. 32 비트를 끄고 최적화를 시작해야합니다. 우리가 할 수있는 어셈블리의 라이브러리 코드. 선택 사항이며 항상 순수한 “C”로 대체됩니다.
그리고 Twitter는 무엇입니까? 농담 이죠? 144 자?! 심각하지 않습니까? 그들은 우리가 가지고있는 하드웨어의 종류를 알아 차렸습니까? 트위터에 대한 말은없고, 좋은 서비스지만, 무슨 말인지 알 것입니다. 그들은 너무 작게 생각하고 그때도 실패합니다.
답변
이 대답이 싫을 거에요.
준비 되었나요?
상황에 따라 다릅니다.
포인터는 C 프로그램이 컴파일되는 컴퓨터의 주소 크기입니다.
- 1980 년대에 인기를 끌었던 Z80 마이크로 프로세서에서 포인터는 16 비트입니다.
- 원래 8086에서 포인터는 주소 공간이 20 비트 폭 이었지만 16, 20 또는 32 비트가 될 수 있습니다. C 컴파일러에게 포인터의 너비를 알려주는 명령 줄 인수를 제공해야했습니다. 악몽이었다.길고 끔찍한 소개는 위키 백과에서 “ 메모리 모델 “을 찾아보십시오.
- 68000 마이크로 프로세서에서 포인터는 32 비트였습니다.
- 약 5 년 전까지 Intel 프로세서에 사용 된 x86 모델에서 여전히 사용할 수있는 포인터는 32 비트로 약 4GB의 주소를 지정할 수 있습니다. 이러한 제한으로 인해 64 비트 주소가 생성됩니다.
- 지난 몇 세대의 Intel 프로세서에 사용 된 x64 모델에서 포인터는 64 비트입니다.
당신은 할 수 없습니다. 포인터가 int와 크기가 같거나 long과 크기가 같다고 가정합니다. 정수 상수 0은 포인터로 변환 할 수 있지만 다른 정수 상수는 변환 할 수 없습니다. 0을 포인터로 변환 할 때 포인터에 포함 된 비트가 모두 0이라는 보장은 없지만 이것이 일반적입니다. 그것은 무엇이든 될 수 있습니다. 0은 유효한 주소가 없음을 가리키는 포인터로 변환 됩니다. 포인터에 정수를 추가하여 포인터를 생성하거나 포인터에서 정수를 빼서 포인터를 생성 할 수 있습니다. 다른 것은 정의되지 않은 영향을 미칩니다.