inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

독하게 되새기는 C 프로그래밍

함수 포인터 기본 문법

함수포인터기본문법 8:21초 질문입니다.

해결된 질문

357

dohyun_lim

작성한 질문수 67

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를 써서 이런 차이가 있는것인가요?

c kernel secure-coding

답변 2

1

널널한 개발자

아니오. 그렇지 않습니다. 이는 Release 빌드에 적용되는 컴파일러 최적화에 따른 결과입니다. 지금 코드에 add() 함수가 보이지는 않지만 아마도 inline 처리가 가능한 작은 함수일 것이고 이를 함수 포인터 변수 초깃값으로 정의했다면 포인터 값이 중간에 달라지지 않는 다는 것을 컴파일러가 인지했을 것입니다. 그러므로 그냥 직접 호출한 것처럼 상수처리 하고 그나마 함수 내부에서 수행하는 연산이 단순 덧셈에 불과한데다 매개변수까지 상수(3, 4)라면 아예 매번 덧셈 할 필요 없이 7로 미리 계산해 출력하도록 최적화 한 것입니다.

컴파일러 최적화는 생각보다 강력합니다. 이와 직접적으로 관련이 있는 것은 상수화 및 변수 참조에 대한 의존서어 분석 등이 있겠습니다. 참고하시기 바랍니다.

P.S: ChatGPT보다 더 좋은 답변을 드려야 하는 세상이네요. ^^;;;;

-1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴이에요.

함수 포인터를 이용해 add 함수를 호출하고 결과를 출력하는 코드에 대한 디스어셈블리 결과를 넣어주셨네요.

함수 포인터가 실제로 메모리에 어떻게 구현되는지는 해당 컴파일러 및 컴퓨터 아키텍처에 따라 다를 수 있습니다.

하지만 대체적으로 함수 포인터는 단순히 함수의 시작주소를 가리키는 포인터이기 때문에 디스어셈블리에서 별도로 “메모리주소” 부분을 표기하지 않을 수도 있습니다.

따라서 12세대 CPU를 쓰고 있다는 점과는 별개로 해당 디스어셈블리 코드에서 add 함수 포인터의 사용 방식이 올바른 지 확인해보시면 될 것 같습니다.

답변이 도움이 되었길 바랍니다. 감사합니다.

병행성 제어

0

41

2

질문이 있습니다(강의와 거의 상관이 없는)

0

72

2

컴파일러 서적 질문입니다

0

156

1

코드생성 및 최적화 질문입니다

0

152

1

Hex Editor를 이용한 다국어 번역 관련 질문입니다

0

206

2

큐의 배열을 넘겨도 정상작동합니다

0

155

2

캐너리비트에 관하여 질문

0

207

3

상수화된 문자열에 질문있습니다

0

167

1

함수 호출 매개변수 전달에 대한 질문 드립니다.

0

187

1

단항 증감 연산에 따른 다른 접근에 대한 질문있습니다.

0

203

2

함수호출 규약 종류에 따른 장단점 여부

0

223

2

정적라이브러리 링크 오류

0

223

1

const char *를 char*에 초기화할때의 컴파일 에러 처리 방식 문의

0

348

2

pszParam 수정이 왜 Hello World print에도 영향을 미치는지 이해가 잘 안됩니다.

0

248

2

비선형 자료구조

0

307

1

자료 구조 공부 후에

0

349

1

강의자료 관련

0

248

1

마지막에 말씀하신 부분 질문드립니다.

0

209

1

문자열 관련 질문 드립니다

0

286

1

라이브러리

0

270

1

부동소수점

0

388

1

왜 변수 주소 사이에 offset이 있는 건가요?

0

298

2

stack 쌓는 순서

0

502

1

함수호출이랑 쓰레드

0

408

1