함수와 여러 개의 중첩 루프가 있습니다. 각 루프는 다른 루프에서 사용하지 않는 다른 변수를 사용합니다.
내 질문은 최적화 고려 사항에 의해 동기가 부여되었습니다.
여기 있습니다 : 어떤 접근 방식이 더 낫습니까?
루프 본문 내부에 지역 변수를 정의하려면
void aspProtocolDetectEvents()
{
uint8_t arrayIndex;
for( arrayIndex = 0; arrayIndex < sizeof(__aspProtocol_events); arrayIndex++ )
{
uint8_t contextBitPosition;
for(contextBitPosition = 0; __aspProtocol_events[arrayIndex] != 0; contextBitPosition++)
{
__aspProtocol_Event contextEvent = utils_getAbsoluteBitPosition(__aspProtocol_events, arrayIndex, contextBitPosition);
if( __aspProtocol_isRisenEvent(contextEvent) )
{
__aspProtocol_dispatchEvent(contextEvent);
__aspProtocol_clearEvent(contextEvent);
}
}
}
}
아니면 다음과 같이 함수 본문의 시작 부분에 모두 정의하는 것이 더 낫습니까? :
void aspProtocolDetectEvents()
{
uint8_t arrayIndex;
uint8_t contextBitPosition;
__aspProtocol_Event contextEvent;
for( arrayIndex = 0; arrayIndex < sizeof(__aspProtocol_events); arrayIndex++ )
{
for(contextBitPosition = 0; __aspProtocol_events[arrayIndex] != 0; contextBitPosition++)
{
contextEvent = utils_getAbsoluteBitPosition(__aspProtocol_events, arrayIndex, contextBitPosition);
if( __aspProtocol_isRisenEvent(contextEvent) )
{
__aspProtocol_dispatchEvent(contextEvent);
__aspProtocol_clearEvent(contextEvent);
}
}
}
}
내 말은, 컴파일러가 그것을 최적화하는지 모르겠습니다. 코드 구조 측면에서 나는 첫 번째 예제를 선호하지만 더 많은 시간이 걸리면 (루프가 반복 될 때마다 할당) 타협하고 두 번째 예제를 사용해야합니다.
현지인이므로 스택에 할당됩니다. 컴파일러는 함수가 호출 될 때 스택 포인터를 조정하여 모든 지역에 충분한 공간이 있는지 확인하여이를 수행합니다.
중첩 된 범위의 변수에 공간이 할당되는 방식에 대해서는 걱정하지 않습니다. 범위가 지정된 로컬을 사용할 때 속도 문제가 있다고 생각되면 프로파일 러를 사용하여 측정하지만 이것이 조기 최적화의 고전적인 경우라고 생각합니다. 대신 읽기 쉽고 유지 관리 할 수있는 코드를 작성하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다