2009-05-05 2 views
2

int 형식의 메서드를 만들 때 컴파일러는 X 비트의 메모리를 메모리에 예약합니다. 그럼 void 타입을 어떻게 보입니까? void 타입이 몇 비트/바이트를 차지합니까?void를 사용하면 메모리에 어떤 데이터 유형이 표시됩니까?

+0

함수에서 반환 값에 대해 이야기하고 있습니까? – MStodd

+2

아무도 그 질문을 읽지 못했습니까? 그는 'int 형의 메소드'라고 말합니다. 'int를 반환하는 메소드'를 의미한다고 가정합니다. 그는 무효 포인터가 얼마나 많은 공간을 차지하는지 묻지 않습니다. 명확히하십시오. – MStodd

답변

13

공백 유형은 비트를 취하지 않습니다. void 유형의 변수를 선언 할 수 없습니다. 이 :

void a; 

컴파일 오류가 발생합니다.
void는 "아무것도"를 의미하는 자리 표시 자입니다. void를 반환하는 함수는 아무 것도 반환하지 않으며 인수로 void를 사용하는 함수는 인수를 사용하지 않습니다.

당신은 그러나 형 무효 *의 변수를 선언 할 수는 :

void* a; 

이것은 단순히 어떤 일이든 무엇이든 가리킬 수 있습니다 포인터를 선언합니다. 임의의 포인터로서 포인터 유형의 크기, 즉 32 비트 시스템에서 전형적으로 4 인 sizeof (void *)의 크기를 취한다.

+0

나는 그가 변수에 대해 이야기하고 있다고 생각하지 않지만, 기능 서명을한다. – MStodd

3

나는 컴파일러가 반환 값을 저장하는 방법을 너무 일반적인 것으로 생각한다고 생각한다. 반환 값은 언어, 유형 및 하드웨어에 따라 결정됩니다.

리턴 값을 보유 할 수있는 '리턴 레지스터'가있을 수 있으므로 메모리가 차지하지 않습니다. 'return register'는 반환되는 타입에 따라 메모리에 할당 된 일부를 가리킬 수도 있습니다.

void를 반환하는 함수가 반환 값에 대한 메모리를 할당 한 적이없는 이유가 표시되지 않습니다.

1

C 또는 C++에는 void 형식이 없습니다 (C#에 대해서는 아무것도 모릅니다). void *는 타입이없는 포인터입니다.

이 약간의 도움이 될 수 있습니다 http://c-faq.com/ansi/voidparith.html

+0

나는 그가 변수에 대해 이야기하고 있다고 생각하지 않지만, 기능 서명을하고있다. – MStodd

+0

malloc은 void를 반환합니다 * ... 이것은 호출로 할당 된 메모리 영역에 대한 일반적인 포인터입니다. C에서는 void *에서 다른 포인터 유형으로 자동 변환됩니다. 반환 된 포인터가 가리키는 메모리의 크기는 malloc에 ​​대한 인수로 지정된 크기입니다. 여전히 void 데이터 형식이 없습니다. 인수 목록에서 사용되며 함수가 인수를 사용하지 않도록 지정합니다. –

0

그냥 정의되지 않은 포인터 타입, 그래서 크기는 당신이 그것을 만들 시스템의 다른 포인터의 크기입니다.

3

(gcc 3.4.6을 사용하는) x86 아키텍처에서 int 함수의 반환 값은 eax 레지스터에 저장됩니다. 부동 소수점 숫자는 XMM 레지스터 또는 ST0을 통해 반환됩니다. [편집 : Bastien Leonard에게 감사드립니다.]

void 함수는 단순히 eax에 아무것도 넣지 않고 리턴합니다. F2와

main: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $24, %esp 
    andl $-16, %esp 
    movl $0, %eax 
    addl $15, %eax 
    addl $15, %eax 
    shrl $4, %eax 
    sall $4, %eax 
    subl %eax, %esp 
    call f1 
    movl %eax, -4(%ebp) 
    call f2 
    call f3 
    fstpl -16(%ebp) 
    movl $0, %eax 
    leave 
    ret 
    .size main, .-main 
    .section  .note.GNU-stack,"",@progbits 
    .ident "GCC: (GNU) 3.4.6" 

정의 :

f2: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    subl $12, %esp 
    pushl $.LC1 
    call printf 
    addl $16, %esp 
    leave 
    ret 
    .size f2, .-f2 

및 F1 정의 :

f1: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $8, %esp 
    subl $12, %esp 
    pushl $.LC0 
    call printf 
    addl $16, %esp 
    movl $9, %eax 
    leave 
    ret 

을 다른 사람이 상이한 코드를 받으면 GCC가 -S와

#include <stdio.h> 

int f1(void) 
{ 
    printf("f1\n"); 
    return 9.0f; 
} 
void f2(void) 
{ 
    printf("f2\n"); 
} 

double f3(void) 
{ 
    return 10.0; 
} 

int main(void) 
{ 
    int x = f1(); 
    f2(); 
    double y = f3(); 
    return 0; 
} 

빌드 흥미있는 다른 버전의 gcc XD를 볼 수 있습니다 (어쩌면 다른 상황에서 int 함수가 스택에 리턴합니다 ...)

모든 구현에서 void 함수가 아무 것도 반환하지 않는다고 생각합니다. 그것은 반환 레지스터를 홀로 남겨두고 스택에 아무것도 남기지 않습니다.

+0

Linux의 x86 및 x86_64 플랫폼에서 int 함수는 스택을 사용하여 반환하지 않습니다. x86에서 long long을 반환하거나 스택에서 반환 값을 확인하려면 모든 플랫폼에서 큰 구조체 (또는 클래스)를 반환합니다. – bdonlan

+1

@ParoXoN : float 및 double이 ST0 또는 XMM 레지스터에 반환됩니다 (코드에서 f3의 반환 값은 FS0으로 검색되어 ST0을 팝합니다). –

+0

아, 그건 의미가있어, 고마워 :) 내 실수! – ParoXoN

2

함수가 void을 반환하면 호출자는 반환 값을 기대하지 않으므로 할당 할 필요가 없습니다. void은 반환 될 실제 형식이 아니므로이 함수가 아무 것도 반환하지 않는다는 것을 컴파일러에 알리는 것이 좋습니다.

PC에서 함수는 특정 레지스터 (eax)에 배치하여 int과 같은 간단한 값을 반환합니다. 컴파일러는이 값을 검색하기위한 적절한 코드를 생성하기 만하면됩니다. 함수가 void을 반환하면 컴파일러는 이러한 종류의 코드를 생성하지 않습니다.
다른 아키텍처에서는 호출자가 암시 적으로 반환 값이 배치 될 int을 가리키는 매개 변수를 전달할 수 있습니다.

이러한 종류의 하위 수준 항목은 C 및 C++ 표준에 의해 지정되지 않습니다. 그것은 다른 표준에 의해 지정 될 수도 있고 단지 대회 일 수도 있습니다.

C#의 경우 응답 값이 CIL 인 방법에 대한 답이 있다고 생각합니다.

관련 문제