2011-01-21 7 views
3

함수 매개 변수가 스택에 배치되지만 컴파일러는 선택적 레지스터를 사용하여이 작업을 최적화 할 수 있습니다. 단지 1-2 개의 매개 변수가있는 경우이 최적화가 시작되고 256 개가 아닌 경우 (최대 개수의 매개 변수를 갖고 싶지는 않음) 의미가 없습니다.함수 매개 변수의 컴파일러 최적화

특정 컴파일러 (예 : gcc)에 대한 매개 변수 제한 (매개 변수 수)을 알면이 최적화가 사용될 수있는 위치를 어떻게 알 수 있습니까?

+1

함수 매개 변수가 있는지 여부에 따라 1) 스택에 배치됩니다. 32 비트 x86을 제외하고는 항상 "레지스터의 일부 매개 변수"였습니다. 스택을 사용하는 것은 x86 시대의 전통이었습니다. –

+1

왜 이것을 알고 싶습니까? –

+5

매개 변수 전달은 컴파일러 최적화 "선택"이 아닙니다. 인수가 전달되는 방법은 코드의 상호 운용성 요구 사항에 따라 다릅니다. stackoverflow를 통해 "호출 규칙"및/또는 "ABI"를 살펴보십시오. 동일한 플랫폼 ('__cdecl','__fastcall','__stdcall' 등)에서 여러 호출 규칙이 존재한다는 사실은 대부분 x86/DOS/Windows 특정 사항입니다. –

답변

4

함수 매개 변수가 스택에 배치되지만 컴파일러는 선택적 레지스터를 사용하여이 작업을 최적화 할 수 있습니다.

FrankH가 자신의 의견에서 말했듯이 내가 질문 할 시스템의 응용 프로그램 이진 인터페이스는 인수가 함수에 전달되는 방법을 결정합니다.이 호출을 해당 플랫폼에 대한 호출 규칙이라고합니다 .

문제가 복잡해지기 때문에 x86 32 비트에는 실제로 몇 가지가 있습니다. 이것은 역사적이며 사실 Win32 비트가 도착했을 때 모두가 다른 일을하는 데 미쳐 버렸습니다.

그렇습니다. 그런 식으로 함수 호출을 작성하여 "최적화"할 수는 있지만, 그렇지 않아야합니다. 플랫폼에 맞는 표준을 따라야합니다. 정직한 진실이기 때문에 스택 접근 속도는 아마도 시스템에서 다른 모든 사람들과 바이너리 호환이 될 정도로 코드를 느려지지는 않을 것입니다.

왜 ABI/표준 호출 규칙이 필요합니까? 음, 프로세서 레지스터, 스택 등을 사용하는 측면에서, 애플리케이션은 무엇을 의미하는지, 어디에서 어디로 가야하는지에 대해 동의해야합니다. 한 함수가 모든 인수가 레지스터에 있다고 결정하고 다른 함수가 스택에 있다고 결정하면 어떻게 상호 운용 될 수 있습니까? 또한 스크래치 레지스터을 의미하므로을 복원 할 필요가 없습니다. 함수를 호출하여 일부 레지스터를 남겨 둘 것을 기대하면 어떻게됩니까?

어쨌든, 당신이 무엇을 요구에 관해서는, 여기에 몇 가지 ABI 문서는 다음과 같습니다

마지막으로 가장 좋아하는 것이 있습니다. 그것을 인용하자면 :

옛 DOS 운영 체제 시대에는 호환성 문제가 거의없는 다른 공급 업체의 개발 도구를 결합하는 것이 종종 가능했습니다.32 비트 Windows에서는 상황이 완전히 벗어났습니다. 다른 컴파일러는 다른 데이터 표현, 다양한 함수 호출 규칙 및 다른 객체 파일 형식을 사용합니다. 정적 링크 라이브러리는 전통적으로 컴파일러 관련 것으로 간주되었지만 동적 링크 라이브러리 (DLL)의 광범위한 사용으로 인해 라이브러리가 이진 형식으로 더 많이 배포되었습니다.

그래서 함수 호출 메소드를 수정하여 최적화하려고 할 때마다하지 마십시오. 최적화 할 수있는 다른 방법을 찾아보십시오. 코드 프로파일. 컴파일러 (-OX)가 도움이된다고 생각한다면 컴파일러 최적화를 조사하여 속도가 정말로 중요 할 경우 검사 할 어셈블리를 덤프하십시오.

0

컴파일러에 대한 자세한 매뉴얼을 읽어야합니다. 운이 좋다면 함수 호출 규칙에 대한 설명에서 찾을 수 있습니다. 그렇지 않으면 gcc과 같은 OSS 컴파일러의 경우 소스 코드를 읽어야 할 것입니다.

2

널리 공개되는 기능의 경우 ABI 표준에 설명되어 있습니다. 외부에서 참조 할 수없는 기능의 경우 모든 베팅은 꺼져 있습니다.

관련 문제