해결된 질문
작성
·
292
·
수정됨
0
안녕하세요 선생님 질문이 있습니다.
저의 경우에 디스어셈블리(release 64)로 확인한 결과
int main()
{
00007FF64DD11070 sub rsp,28h
int (*pfAdd)(int, int) = add;
result = pfAdd(3, 4);
printf("Result %d\n", result);
00007FF64DD11074 mov edx,7
00007FF64DD11079 mov dword ptr [result (07FF64DD13638h)],7
00007FF64DD11083 lea rcx,[string "Result %d\n" (07FF64DD12250h)]
00007FF64DD1108A call printf (07FF64DD11010h)
return 0;
00007FF64DD1108F xor eax,eax
}
add (메모리주소) 부분이 없는데 12세대 cpu를 써서 이런 차이가 있는것인가요?
답변 2
1
아니오. 그렇지 않습니다. 이는 Release 빌드에 적용되는 컴파일러 최적화에 따른 결과입니다. 지금 코드에 add() 함수가 보이지는 않지만 아마도 inline 처리가 가능한 작은 함수일 것이고 이를 함수 포인터 변수 초깃값으로 정의했다면 포인터 값이 중간에 달라지지 않는 다는 것을 컴파일러가 인지했을 것입니다. 그러므로 그냥 직접 호출한 것처럼 상수처리 하고 그나마 함수 내부에서 수행하는 연산이 단순 덧셈에 불과한데다 매개변수까지 상수(3, 4)라면 아예 매번 덧셈 할 필요 없이 7로 미리 계산해 출력하도록 최적화 한 것입니다.
컴파일러 최적화는 생각보다 강력합니다. 이와 직접적으로 관련이 있는 것은 상수화 및 변수 참조에 대한 의존서어 분석 등이 있겠습니다. 참고하시기 바랍니다.
P.S: ChatGPT보다 더 좋은 답변을 드려야 하는 세상이네요. ^^;;;;
-1
안녕하세요, 인프런 AI 인턴이에요.
함수 포인터를 이용해 add 함수를 호출하고 결과를 출력하는 코드에 대한 디스어셈블리 결과를 넣어주셨네요.
함수 포인터가 실제로 메모리에 어떻게 구현되는지는 해당 컴파일러 및 컴퓨터 아키텍처에 따라 다를 수 있습니다.
하지만 대체적으로 함수 포인터는 단순히 함수의 시작주소를 가리키는 포인터이기 때문에 디스어셈블리에서 별도로 “메모리주소” 부분을 표기하지 않을 수도 있습니다.
따라서 12세대 CPU를 쓰고 있다는 점과는 별개로 해당 디스어셈블리 코드에서 add 함수 포인터의 사용 방식이 올바른 지 확인해보시면 될 것 같습니다.
답변이 도움이 되었길 바랍니다. 감사합니다.