함수 매개 변수가 스택에 배치되지만 컴파일러는 선택적 레지스터를 사용하여이 작업을 최적화 할 수 있습니다. 단지 1-2 개의 매개 변수가있는 경우이 최적화가 시작되고 256 개가 아닌 경우 (최대 개수의 매개 변수를 갖고 싶지는 않음) 의미가 없습니다.함수 매개 변수의 컴파일러 최적화
특정 컴파일러 (예 : gcc)에 대한 매개 변수 제한 (매개 변수 수)을 알면이 최적화가 사용될 수있는 위치를 어떻게 알 수 있습니까?
함수 매개 변수가 스택에 배치되지만 컴파일러는 선택적 레지스터를 사용하여이 작업을 최적화 할 수 있습니다. 단지 1-2 개의 매개 변수가있는 경우이 최적화가 시작되고 256 개가 아닌 경우 (최대 개수의 매개 변수를 갖고 싶지는 않음) 의미가 없습니다.함수 매개 변수의 컴파일러 최적화
특정 컴파일러 (예 : gcc)에 대한 매개 변수 제한 (매개 변수 수)을 알면이 최적화가 사용될 수있는 위치를 어떻게 알 수 있습니까?
함수 매개 변수가 스택에 배치되지만 컴파일러는 선택적 레지스터를 사용하여이 작업을 최적화 할 수 있습니다.
FrankH가 자신의 의견에서 말했듯이 내가 질문 할 시스템의 응용 프로그램 이진 인터페이스는 인수가 함수에 전달되는 방법을 결정합니다.이 호출을 해당 플랫폼에 대한 호출 규칙이라고합니다 .
문제가 복잡해지기 때문에 x86 32 비트에는 실제로 몇 가지가 있습니다. 이것은 역사적이며 사실 Win32
비트가 도착했을 때 모두가 다른 일을하는 데 미쳐 버렸습니다.
그렇습니다. 그런 식으로 함수 호출을 작성하여 "최적화"할 수는 있지만, 그렇지 않아야합니다. 플랫폼에 맞는 표준을 따라야합니다. 정직한 진실이기 때문에 스택 접근 속도는 아마도 시스템에서 다른 모든 사람들과 바이너리 호환이 될 정도로 코드를 느려지지는 않을 것입니다.
왜 ABI/표준 호출 규칙이 필요합니까? 음, 프로세서 레지스터, 스택 등을 사용하는 측면에서, 애플리케이션은 무엇을 의미하는지, 어디에서 어디로 가야하는지에 대해 동의해야합니다. 한 함수가 모든 인수가 레지스터에 있다고 결정하고 다른 함수가 스택에 있다고 결정하면 어떻게 상호 운용 될 수 있습니까? 또한 스크래치 레지스터은 을 의미하므로을 복원 할 필요가 없습니다. 함수를 호출하여 일부 레지스터를 남겨 둘 것을 기대하면 어떻게됩니까?
어쨌든, 당신이 무엇을 요구에 관해서는, 여기에 몇 가지 ABI 문서는 다음과 같습니다
마지막으로 가장 좋아하는 것이 있습니다. 그것을 인용하자면 :
옛 DOS 운영 체제 시대에는 호환성 문제가 거의없는 다른 공급 업체의 개발 도구를 결합하는 것이 종종 가능했습니다.32 비트 Windows에서는 상황이 완전히 벗어났습니다. 다른 컴파일러는 다른 데이터 표현, 다양한 함수 호출 규칙 및 다른 객체 파일 형식을 사용합니다. 정적 링크 라이브러리는 전통적으로 컴파일러 관련 것으로 간주되었지만 동적 링크 라이브러리 (DLL)의 광범위한 사용으로 인해 라이브러리가 이진 형식으로 더 많이 배포되었습니다.
그래서 함수 호출 메소드를 수정하여 최적화하려고 할 때마다하지 마십시오. 최적화 할 수있는 다른 방법을 찾아보십시오. 코드 프로파일. 컴파일러 (-OX
)가 도움이된다고 생각한다면 컴파일러 최적화를 조사하여 속도가 정말로 중요 할 경우 검사 할 어셈블리를 덤프하십시오.
컴파일러에 대한 자세한 매뉴얼을 읽어야합니다. 운이 좋다면 함수 호출 규칙에 대한 설명에서 찾을 수 있습니다. 그렇지 않으면 gcc
과 같은 OSS 컴파일러의 경우 소스 코드를 읽어야 할 것입니다.
널리 공개되는 기능의 경우 ABI 표준에 설명되어 있습니다. 외부에서 참조 할 수없는 기능의 경우 모든 베팅은 꺼져 있습니다.
함수 매개 변수가 있는지 여부에 따라 1) 스택에 배치됩니다. 32 비트 x86을 제외하고는 항상 "레지스터의 일부 매개 변수"였습니다. 스택을 사용하는 것은 x86 시대의 전통이었습니다. –
왜 이것을 알고 싶습니까? –
매개 변수 전달은 컴파일러 최적화 "선택"이 아닙니다. 인수가 전달되는 방법은 코드의 상호 운용성 요구 사항에 따라 다릅니다. stackoverflow를 통해 "호출 규칙"및/또는 "ABI"를 살펴보십시오. 동일한 플랫폼 ('__cdecl','__fastcall','__stdcall' 등)에서 여러 호출 규칙이 존재한다는 사실은 대부분 x86/DOS/Windows 특정 사항입니다. –