문제

이것은 인터뷰 질문이었습니다. 나는 그들이 동일하다고 말했지만 이것은 잘못된 응답으로 판결되었습니다. 어셈블러 관점에서 상상할 수있는 차이가 있습니까? 기본 GCC 최적화를 사용하여 두 개의 짧은 C 프로그램을 컴파일하고 -S 어셈블러 출력을보기 위해 -s를 보냈으며 동일합니다.

도움이 되었습니까?

해결책

면접관은 다음과 같은 답변을 원했을 것입니다.

i=i+1 값을로드해야합니다 i, 하나를 추가 한 다음 결과를 다시 저장하십시오. i. 대조적으로, ++i 단일 어셈블리 명령을 사용하여 값을 단순히 증가시킬 수 있으므로 이론적으로는 더 효율적 일 수 있습니다. 그러나 대부분의 컴파일러는 차이를 최적화하고 생성 된 코드는 정확히 동일합니다.

FWIW, 당신이 어셈블리를 보는 방법을 알고 있다는 사실은 몇 년 동안 인터뷰해야했던 사람들의 90%보다 더 나은 프로그래머가됩니다. 당신이 당신을 인터뷰 한 단서가없는 패자와 함께 일할 필요가 없다는 사실에 위안을 취하십시오.

다른 팁

당신이 옳은 것 같고 그들은 틀렸다. 면접에서 비슷한 문제가 있었는데, 그곳에서 틀린 것으로 간주되는 정답을주었습니다.

나는 자신의 면접관과의 요점을 자신있게 주장했다. 나는 일자리를 얻지 못했지만 다시 한 번“모든 것을 알고있는 사람”아래에서 일하는 것도 그렇게 바람직하지 않을 것입니다.

당신은 아마 옳을 것입니다. 순진한 컴파일러가 할 수 있습니다.

++i to inc [ax]

그리고

i = i + 1 to add [ax], 1

그러나 절반의 현명한 컴파일러는 첫 번째 버전에 1을 추가하는 것을 최적화합니다.

이 모든 것은 관련 아키텍처가 Inc를 가지고 있다고 가정하고 (x86과 같이) 지침을 추가합니다.

면접관을 방어하기 위해 맥락이 전부입니다. i의 유형은 무엇입니까? C 또는 C ++ (또는 언어와 같은 다른 C)를 말하고 있습니까? 당신은 주어 졌습니까 :

++i;
i = i + 1;

아니면 더 많은 맥락이 있었습니까?

내가 이것을 물었다면, 나의 첫 번째 응답은 "내가 변동성이 있습니까?" 대답이 예라면 차이가 엄청납니다. 그렇지 않다면, 차이는 작고 의미 적이지만 실용적으로는 없습니다. 그 증거는 구문 분석 트리의 차이와 생성 된 하위 트리의 궁극적 인 의미입니다.

그래서 그것은 당신이 실용적인 측면을 오른쪽으로 만든 것처럼 들리지만 의미 적/비판적 사고는 잘못된 것 같습니다.

면접관을 공격하려면 (문맥없이) 질문의 목적이 무엇인지 궁금해해야합니다. 내가 질문을했다면, 후보자가 미묘한 의미 차이를 알고 있는지, 구문 분석 트리를 생성하는 방법, 비판적으로 생각하는 방법 등을 알고 싶을 것입니다. 나는 일반적으로 인터뷰 대상자들의 C 질문을 거의 모든 후보자가 잘못되었다는 것을 묻습니다. 그리고 그것은 디자인에 의한 것입니다. 나는 실제로 질문에 대한 답에 대해 신경 쓰지 않는다. 후보자와 함께 할 여정에 관심이 있습니다. 이해에 도달하기 위해 퀴즈 질문에서 옳고 그름보다 훨씬 더 많은 것을 알려줍니다.

C ++에서는 다음과 같은 경우에 따라 다릅니다 i int 또는 객체입니다. 객체라면 아마도 임시 인스턴스를 생성 할 수 있습니다.

최적화 된 릴리스 빌드에서 컴파일러는 간단한 [INC EAX]에 사용할 수있는 경우 I ++를 최적화 할 수 있기 때문에 컨텍스트는 여기에서 가장 중요한 것입니다. int nod_int = i ++와 같은 것은 i 값을 먼저 sode_int에 저장해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top