캐티
4k
2021-07-22 04:03:52
2
421

C언어 에서 구조체로 인자를 주면 포퍼먼스 향상이 될까여?


C언어가 나온지 정말 오래 되었어요.

인자를 전달하는 PUSH-CALL 방식은 8086 에서도 찾아볼 수 있어요. 언제 부터 시작된건진 모르겠네요.
https://en.wikipedia.org/wiki/X86_instruction_listings

프로그램 퍼포먼스 향상에 목맨분들이 적지 않을 것이에요. 구조체 방식은 어떤 언어에서도 비슷하게 구현이 되는데 이런다고 프로그램 작동이 빨라질 수 있을까요.

인자 여러개.

>> CALL TEST(1,2,3,4,5,6)
PUSH 6
PUSH 5
PUSH 4
PUSH 3
PUSH 2
PUSH 1
CALL TEST
구조체 인자
>> CALL TEST(struct {1,2,3,4,5,6})
struct {1,2,3,4,5,6}
PUSH DS:[struct]
CALL TEST


프로그램 구조를 구조체 콜 방식으로 하면 생길 수 있는 단점은 정적 데이터로 배치시킨 경우에 in/out 겸하는 구조체에 문제가 생길 수 있겠어요.

물론 기본원칙으로 넣는 인자는 변화 할 수 없다는 가정을 넣으면 되겠쩌. 인자는 더 넣을 수 있으니까요.

코딩을 할 때 가득이나 인자수가 많아지면 한 화면에서 자꾸 벗어나서 불편하기도 하여요. 인자 수가 많아지면 실수 할 수도 있거든요. (자바스크립트 .. 간혹 하나 빼먹습니다)

PUSH-CALL 에 입력 명령어가 여러번실행되면 그만큼 낭비가 될 수 있을것 같아요. CPU 처리 구조에서 참조메모리를 읽어야 하는 점은 단점이 될 수 있겠지만 자주 실행할때 오히려 캐시메모리에 좋은 자리에 배치가 되서 좋지 않을까 싶어요.

현재까지도 윈도우 api에 좀 인자수가 많다 싶은 함수에 주로 쓰이기도 해요.

처음부터 이 원칙을 베이스로 하면 나쁠것 같나요?

-1
0
  • 댓글 2

  • 다먹고살자고하는거지
    43
    2021-07-22 06:53:59

    x86은 잘 모르고, 32bit arm calling convention을 이야기해보자면,

    dword(32bit) parameter 5개까지는 stack push 없이 register를 사용합니다.

    그래서 arm 기반 과제의 경우 coding standard에 parameter 수 제한을 하는 이유가 단순히 가독성만을 위한 것은 아닙니다.

    만약 parameter 중에 dword보다 작은 것이 여러개라면 구조체로 묶는 것이 효과적입니다. 다만 이 경우에도 주의해야 할 점은 구조체 크기가 5dword를 넘는 순간 오히려 stack을 사용해서 성능이 더 낮아질 수 있습니다.

  • 엡실론
    2k
    2021-07-22 08:15:49

    x64에서도 microsoft x64와 system v amd64 에서는 4번째 6번째 인자까지는 레지스터를 씁니다. x86에서는 2번째까지 레지스터를 쓰는 __fastcall 이 있고요. 그리고 calling convention이라는게 결국 외부 라이브러리와의 표준이니 내부적으로야 마음대로 쓸 수 있습니다. 실제 컴파일러 최적화에서도 내부에서만 사용되는 함수는 calling convention에 구애받지 않고 레지스터를 쓰거나 여러가지가 생략됩니다.

    결론적으로 퍼포먼스 측면에서는 별 가치가 없습니다. 단순하게 성능향상이 가능하면 이미 컴파일러 최적화에서 지원하거나, 곧 지원하게 될겁니다. 일반적인 컴파일러를 쓸 수 없는 특수한 상황에서나 생각해볼만 합니다.

    가독성 측면에서는 꽤 좋을 수 있습니다. 인자가 많아지면 ide 도움없이 그냥 코드만 봤을때 몇번째 인자인지 각 인자의 의미가 뭔지 알기 힘드니, 적절하게 구조체 같은 걸 사용하면 도움이 됩니다.

  • 로그인을 하시면 댓글을 등록할 수 있습니다.